出于某种原因,我需要在一个单独的线程上执行BeginReceive,就像这个例子一样:
public void WaitForData()
{
Thread t = new Thread(WaitForDataThread);
t.Start();
}
public void WaitForDataThread()
{
try
{
CSocketPacket theSocPkt = new CSocketPacket();
theSocPkt.thisSocket = m_socClient;
m_asynResult = m_socClient.BeginReceive(theSocPkt.dataBuffer, 0, theSocPkt.dataBuffer.Length, SocketFlags.None, OnDataReceived, theSocPkt);
}
catch (SocketException se)
{
MessageBox.Show(se.Message);
}
}
但是我在BeginReceive调用之后总是收到错误,OnDataReceived立即被引发,在那种情况下它会调用EndReceive方法,并且总是抛出这个错误:“I / O操作因为中止而中止线程退出或应用程序请求“。
但是如果我删除单独的线程部分(比如直接调用WaitForDataThread(),而不通过WaitForData()方法),一切正常。
如果您想知道为什么我需要创建一个单独的线程,那是因为我需要在一个事件期间调用BeginReceive,该事件将从另一个类的不同线程生成。这与创建像上面的示例一样的新线程非常相似,我需要让它工作。
有没有办法可以做到这一点?
答案 0 :(得分:2)
在msdn(Socket.EndReceive文档)上找到答案:
由给定线程发起的所有I / O都是 该线程退出时取消。一个 挂起异步操作即可 如果线程在之前退出则失败 操作完成。
您必须确保在完成套接字I / O之后,启动套接字操作的线程不会退出。
解决方法是使用线程池线程,如here所述。
答案 1 :(得分:1)
我假设您的主线程不会等到数据到来,并且只是在产生另一个线程后退出。完成主线程会终止整个应用程序,所以你的WaitForData线程也会死掉。
您必须执行以下操作: