BeginReceive在一个单独的线程中

时间:2010-12-20 17:39:37

标签: .net sockets asynchronous

出于某种原因,我需要在一个单独的线程上执行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,该事件将从另一个类的不同线程生成。这与创建像上面的示例一样的新线程非常相似,我需要让它工作。

有没有办法可以做到这一点?

2 个答案:

答案 0 :(得分:2)

msdn(Socket.EndReceive文档)上找到答案:

  

由给定线程发起的所有I / O都是   该线程退出时取消。一个   挂起异步操作即可   如果线程在之前退出则失败   操作完成。

您必须确保在完成套接字I / O之后,启动套接字操作的线程不会退出。

解决方法是使用线程池线程,如here所述。

答案 1 :(得分:1)

我假设您的主线程不会等到数据到来,并且只是在产生另一个线程后退出。完成主线程会终止整个应用程序,所以你的WaitForData线程也会死掉。

您必须执行以下操作:

  1. 启动WaitForData-thread
  2. 在主线程中执行任何操作
  3. 等到WaitForData-thread在主线程(Thread.Join?)
  4. 中完成
  5. 然后退出。