我使用的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();
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top