0

我使用了.Net的Socket.BeginReceive方法,当我从EndReceive方法获取数据时,我使用AutoResetEvent.waitone无限阻塞EndReceive代码线程我发现BeginReceive无法工作;所有线程都被阻塞;在计时器完成并发出事件我可以再次获取数据之前,我什么也得不到。BeginReceive 不是异步方法吗?

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);

只需处理计时器我必须创建新线程等待!

4

1 回答 1

0

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

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

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; });
    }
}

您需要向SetAutoResetEvent发出信号表明该资源是免费的。在您提供的内容中,我看不到任何代码。

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

于 2013-08-02T11:12:41.137 回答