首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >.net Sock.BeginReceive和阻塞EndReceive

.net Sock.BeginReceive和阻塞EndReceive
EN

Stack Overflow用户
提问于 2013-08-02 10:05:41
回答 1查看 315关注 0票数 0

我使用了.NET的Socket.BeginReceive方法,当我从EndReceive方法获得数据时,我使用了AutoResetEvent.waitone块-- EndReceive代码线程--我发现BeginReceive无法工作;所有线程都被阻塞;直到计时器完成并发出信号,我可以再次获得数据。BeginReceive不是异步方法吗?

代码语言:javascript
复制
var sock= new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

sock.BeginReceive(buffer, 0, 1024, SocketFlags.None, i => {
    var sock= (Socket)i.AsyncState;
    int readNum=sock.EndReceive(i);
    var reset= new AutoResetEvent(false);
    Timer timer = new Timer({ Thread.Sleep(1000000000); reset.set() });

    reset.WaitOne(Timeout.Infinite);
    time.Dispose();
} ,sock);

只需配置定时器,我就必须创建新线程等待!!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-02 11:12:41

AutoResetEvente被封装在一个临时闭包中,因此为处理EndReceive代码而创建的线程将无限期地等待。

最好将代码重构为如下内容:

代码语言:javascript
复制
bool stopped = false;
var timer = null;

void MainFunction()
{
    var buffer = new byte[1024];
    var sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

    sock.BeginReceive(buffer, 0, 1024, SocketFlags.None, new AsyncCallback(ReadCallback), sock);
}

void ReadCallback(IAsyncResult ar)
{
    var sock = (Socket)ar.AsyncState;

    int readNum = sock.EndReceive(ar);

    // begin receiving again as long as we shouldn't be stopped
    if (stopped == false)
    {
        sock.BeginReceive(buffer, 0, 1024, SocketFlags.None, new AsyncCallback(ReadCallback), sock);
    }

    if (timer == null)
    {
        Timer timer = new Timer({ Thread.Sleep(1000000000); stopped = true; });
    }
}

您需要Set您的AutoResetEvent来表示资源是空闲的。我看不出你提供的任何密码。

您可能想看看http://msdn.microsoft.com/en-us/library/system.threading.autoresetevent.aspx中的一些示例和文档

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18014232

复制
相关文章

相似问题

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