c# - 异步Socket.Begin接收内部调用之谜

标签 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语句等均无济于事。

最令人困惑的部分是,当我使用自己编写的测试服务器运行它时,它的工作与我期望的一样。如果看起来很熟悉,此代码实质上来自异步套接字上的MSDN示例。只有当我在第三方设备上尝试时,我才受阻。

任何想法可能在这里发生什么?

最佳答案

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

关于c# - 异步Socket.Begin接收内部调用之谜,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3300473/

相关文章:

c# - 如何将第二个外键添加到已经是复合外键一部分的 EF 属性

创建 3 个线程并使用 WSAWaitForMultipleEvents() 和 WSAEnumNetworkEvents() 时 CPU 使用率 100%

sockets - unix 域套接字 - 保护接收器

java - 对 Java 中不同的 I/O 方法感到压力

java - 扫描仪 hasNext() ,但无法使用 nextLine() 读取

c# - 在原始按钮所在的位置显示另一个按钮

c# - 如果检查了所有子节点,则检查父节点 C# asp.net

c# - 如何从 Visual Studio 调试输出窗口读取文本

Python 的 `concurrent.futures` : Iterate on futures according to order of completion

multithreading - Golang 中的可窥视队列