BeginReceive /的BeginRead超时
-
28-09-2019 - |
题
我使用的NetworkStream&TcpClient的使用的BeginRead异步接收数据。我需要一个超时适用于这种操作,使得在指定时间之后读将被中止。
至于我能告诉,这是不支持的NetworkStream或TcpClient的 - 有一个ReceiveTimeout属性,但是这似乎只适用于同步等同 - “读”
。即使底层Socket类似乎不支持超时在其BeginReceive方法。
我搜索关于这个问题,唯一的建议的解决我所看到的是另外搭建后台线程取消操作,如果它不超时期限内完成。这似乎是一个可怕的黑客。一定有一更好的方法?
解决方案
这是做到这一点的唯一方法,因为当你使用一个异步操作,启动了操作熄灭做别的事情的线程。因为执行线程被阻塞,直到读操作完成的超时是可用的同步版本。
如果你将不得不使用一个后台线程取消操作,不过,不会有太多点继续使用异步开始/结束的方法。如果你打算分拆后台线程,刚刚从后台线程执行同步读取操作,然后你可以使用ReceiveTimeout。
其他提示
在 ManualResetEvent的等待一些超时值以信号时,你的任务就完成了。如果超时它发出信号之前,那么你知道,异步操作没有完成。
private ManualResetEvent receiveDone = new ManualResetEvent(false);
receiveDone.Reset();
socket.BeginReceive(...);
if(!receiveDone.WaitOne(new TimeSpan(0, 0, 0, 30))) //wait for 30 sec.
throw new SocketException((int)SocketError.TimedOut);
内部BeginReceive回调,使用
private void ReceiveCallBack(IAsyncResult ar)
{
/** Use ar to check if receive is correct and complete */
receiveDone.Set();
}
不隶属于 StackOverflow