我有一个来自异步客户端方法的接收回调,该方法应该在内部调用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/