中止线程+套接字连接

时间:2014-02-25 08:26:51

标签: c# multithreading sockets dispose

我有一个(非常基本的理解,我认为)关于线程化和中止的问题:

情况是:我在一个线程中有一个打开的套接字连接 - 现在我正在通过thread.Abort()中止该线程。

问题是:套接字连接会发生什么?是关闭和处置?或者我必须自己照顾这个?

附录:

在这里创建线程:

foreach (Pcd pcd in LstPcds)
        {
           Thread.Sleep(delay);
           Thread thread = new Thread(pcd.Simulate);
           _lstActiveThreads.Add(thread);
           thread.IsBackground = true;
           thread.Name = pcd.ToString();
           thread.Start();
           count++;
        }

并且应该处理/中止/不论这里:

  public void DisposePcds()
  {
     try
     {
        foreach (Thread thread in _lstActiveThreads)
        {
           thread.Abort();
        }
     }
     catch (Exception exception)
     {
        MessageBox.Show(exception.ToString());
     }
  }

每个thread都有一个开放的Socket连接,如下所示:

// connecting (async) to the service
// blocks the thread until connection is established
ConnectionSocket = new Socket(_ipEndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
ConnectionSocket.BeginConnect(_ipEndPoint, ConnectCallback, ConnectionSocket);
_manualConnectEvent.WaitOne();

// begin receive data from the server
ReceiveDto receive = new ReceiveDto { Socket = ConnectionSocket };
ConnectionSocket.BeginReceive(receive.Buffer, 0, ReceiveDto.GetBufferSize(), 0, ReceiveCallback, receive);

加上一个Timer及其经过的事件,其中每个Socket发送一个字节数组:

byte[] request = GetRegisterRequestCommand(bank);
ConnectionSocket.Send(request, SocketFlags.None);

1 个答案:

答案 0 :(得分:1)

请阅读有关该主题的MSDN文档。

首先。不,你的代码永远不会工作。一次性需要显式调用它们.Dispose()或者通过using(IDisposable){}的语法糖来隐式调用它们。

现在查看ThreadAbortException您可以捕获异常(但它会被重新抛出)。所以using(由编译器转换为try{}finally{Dispose()})将起作用。

但你没有异常处理。