Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 中止线程+;插座连接_C#_Multithreading_Sockets_Dispose - Fatal编程技术网

C# 中止线程+;插座连接

C# 中止线程+;插座连接,c#,multithreading,sockets,dispose,C#,Multithreading,Sockets,Dispose,我有一个(我认为是非常基本的理解)关于线程和中止的问题: 情况是:我在一个线程中有一个打开的套接字连接-现在我正在通过thread.Abort()中止该线程 问题是:套接字连接会发生什么变化?它会被关闭和处理吗?还是我必须自己处理 附件: 线程在此处创建: foreach (Pcd pcd in LstPcds) { Thread.Sleep(delay); Thread thread = new Thread(pcd.Simulate

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

情况是:我在一个线程中有一个打开的套接字连接-现在我正在通过
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());
     }
  }
每个
线程
都有一个打开的
套接字
连接,如下所示:

// 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);
加上一个计时器及其经过的事件,其中每个
套接字
发送一个字节数组:

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

只需阅读有关此主题的MSDN文档

首先。不,你的代码永远不会工作。Disposables需要显式地调用
.Dispose()
,或者使用(IDisposable){}通过
的语法糖隐式地调用

现在看一下
ThreadAbortException
,您可以捕获异常(但它会被重新捕获)。因此,
使用
(编译器将其转换为
try{}最后{Dispose()}
)将起作用


但是您没有异常处理。

永远不要使用
Thread.Abort()
。真正地很少有正当的理由使用它。您应该使用一种机制(如
AutoResetEvent
等)来允许线程正确关闭自己。您能告诉我们中止线程并关闭连接的部分吗?不清楚您的线程是在哪里创建的?堕胎时你的线程在做什么?看起来您正在使用套接字的异步API。没有充分的理由使用线程,我也不这么认为。您在何处创建线程以及它的作用是什么?
Thread.Abort
是不可预测的,在这种可管理的情况下应该避免。看看您如何使用TPL来执行。正如@SriramSakthivel所说的。你不需要穿线。您可以在所有单线程异步情况下执行此操作。谢谢aron-我知道这段代码在我们的任何领域都不起作用,但实际上这并不是一个“真实”场景的问题,只是我对“处理”线程及其内部操作的工作方式缺乏了解。