首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BeginReceive / BeginRead超时

BeginReceive / BeginRead超时
EN

Stack Overflow用户
提问于 2010-08-12 17:34:25
回答 2查看 11.9K关注 0票数 16

我使用NetworkStream & TcpClient通过BeginRead异步接收数据。我需要对此操作应用超时,以便在指定的时间量之后,读取将被中止。

据我所知,这在NetworkStream或TcpClient上是不受支持的--有一个ReceiveTimeout属性,但这似乎只适用于同步的等价物-- 'Read‘。

甚至底层套接字类在其BeginReceive方法中似乎也不支持超时。

我已经在这个问题上进行了搜索,我看到的唯一建议的解决方案是设置另一个后台线程,如果该操作在超时期限内没有完成,则取消该操作。这看起来像是一个可怕的黑客攻击。当然还有更好的方法?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-04-21 12:55:35

这是唯一的方法,因为当您使用异步操作时,启动该操作的线程正在执行其他操作。同步版本的超时是可用的,因为执行线程会被阻塞,直到读取操作完成。

但是,如果您必须使用后台线程来取消操作,那么继续使用异步Begin/End方法就没有多大意义了。如果要关闭后台线程,只需从后台线程执行同步读取操作,然后就可以使用ReceiveTimeout了。

票数 2
EN

Stack Overflow用户

发布于 2012-07-12 14:54:06

ManualResetEvent上等待某个超时值,以便在任务完成时发出信号。如果它在收到信号之前超时,那么您就知道该异步操作从未完成。

代码语言:javascript
复制
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回调中,使用

代码语言:javascript
复制
private void ReceiveCallBack(IAsyncResult ar)
{
    /** Use ar to check if receive is correct and complete */
    receiveDone.Set();
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3466332

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档