- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我编写了以下函数来使用 NetworkStream
的异步读取函数(BeginRead
和 EndRead
)实现超时功能。它工作正常,直到我注释掉行 Trace.WriteLine("bytesRead: "+ bytesRead);
。为什么?
private int SynchronousRead(byte[] buffer, int count)
{
int bytesRead = 0;
bool success = false;
IAsyncResult result = null;
result = _stream.BeginRead(
buffer, 0, count,
delegate(IAsyncResult r)
{
bytesRead = _stream.EndRead(r);
},
null);
success = result.AsyncWaitHandle.WaitOne(_ioTmeoutInMilliseconds, false);
if (!success)
{
throw new TimeoutException("Could not read in the specfied timeout.");
}
//If I remove this line, bytesRead is always 0
Trace.WriteLine("bytesRead: " + bytesRead);
return bytesRead;
}
以防万一你想知道,我必须这样做,因为我最终需要以 .Net Compact Framework 3.5 为目标,它不支持 NetworkStream.ReadTimeout
和 NetworkStream.WriteTimeout
属性。
最佳答案
一个有趣的线程错误。 bytesRead 变量在等待句柄发出信号后被赋值。有两件事可能会出错:方法在赋值完成之前就返回了。或者线程读取过时值,因为它们在 WaitOne() 调用之后没有内存障碍。 Trace 语句解决了这个问题,因为它延迟了主线程足够长的时间以允许写入变量。它有一个内部锁,确保缓存是一致的。
您将需要一个额外的 AutoResetEvent 来表示已写入 bytesRead 变量。
关于c# - 使用 NetworkStream.BeginRead 和 NetworkStream.EndRead 实现超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7696856/
与使用(双向)NetworkStream 的异步 IO 相关,MSDN说“每次调用 BeginRead 都必须调用一次 EndRead。” 即使对于 EndRead() 将抛出异常的情况,例如在发出
我对使用异步模式进行流读写比较陌生,想知道这个问题的答案是否如此明显,以至于没有明确地写在任何地方: 当调用 NetworkStream.BeginRead 时,我传递了一个回调参数,根据 MSDN,
我想知道在我的 C# 异步套接字中,在 EndRead 调用中接收到 0 字节是否意味着服务器实际上已经断开了我们的连接? 我看到的许多例子都表明是这种情况,但我收到的断开连接频率比我预期的要高得多。
我编写了一个通过 SslStream 进行通信的 TcpClient 和服务器。通信有效,但是当我从客户端向服务器发送消息时,服务器首先读取 1 个字节,然后在下一步中读取其余部分。例子:我想通过Cl
我还不太“了解”async 和 await,我正在寻找关于我将要解决的特定问题的一些说明。基本上,我需要编写一些代码来处理 TCP 连接。它基本上只是接收数据并处理它,直到连接关闭。 我通常使用 Ne
我正在使用 NetworkStream.BeginRead/EndRead 从套接字进行异步读取。 但是,NetworkStream.EndRead() 有时会返回 0(即从套接字读取了 0 个字节)
我试图理解 NetworkStream.EndRead() 的 MSDN 示例。有些部分我不明白。 下面是示例(从 MSDN 复制): // Example of EndRead, DataAvail
我编写了以下函数来使用 NetworkStream 的异步读取函数(BeginRead 和 EndRead)实现超时功能。它工作正常,直到我注释掉行 Trace.WriteLine("bytesRea
我是一名优秀的程序员,十分优秀!