Async Socket.BeginReceive内部调用之谜

时间:2010-07-21 14:43:20

标签: c# multithreading sockets asynchronous

我有一个来自异步客户端方法的接收回调,它应该在内部调用socket.BeginReceive来检查数据是否已完成发送。代码如下:

    private void ReceiveCallback(IAsyncResult ar)
    {
        try
        {
            StateObject state = (StateObject)ar.AsyncState;
            Socket client = state.workSocket;
            int bytesRead = client.EndReceive(ar);

            if (bytesRead > 0)
            {
                state.sb.Append(Encoding.ASCII.GetString(state.buffer, 0, bytesRead));
                client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, 
                    new AsyncCallback(ReceiveCallback), state);
            }
            else
            {
                if (state.sb.Length > 1)
                {
                    response = state.sb.ToString();
                }
                File.AppendAllText(DataDisplay.Properties.Settings.Default.rawDataLog, response + "\r\n");
                receiveDone.Set();
            }
        }
        catch (Exception e)
        {
            Console.WriteLine(e.ToString());
        }

这个问题是当代码到达client.BeginReceive时,没有任何反应。我知道这听起来很模糊,所以让我试着解释一下。我在整个代码中设置了断点,看看它可能会走向何方,我无法弄明白。我已经尝试了else案例,ReceiveCallback的开头,receivedone.Set()在主代码中返回,catch语句等等无效。< / p>

最令人困惑的部分是,当我用我编写的测试服务器运行它时,它可以正常工作。这段代码基本上来自异步套接字上的MSDN示例,以防它看起来很熟悉。只有当我尝试使用第三方设备时,我才会受到阻碍。

有什么想法可以在这里发生什么?

1 个答案:

答案 0 :(得分:1)

是否有可能在您进行调试时,实际上没有收到任何内容,因此它基本上永久地等待接收线程?请注意BeginReceive将使用ThreadPool线程,并将回调您发布的方法。如果它没有回电话,那么我的第一印象是它没有收到任何东西。