【发布时间】:2014-02-25 08:26:50
【问题描述】:
我有一个(我认为非常基本的理解)关于线程和中止这些的问题:
情况是:我在一个工作线程中有一个打开的套接字连接 - 现在我正在通过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);
【问题讨论】:
-
永远不要使用
Thread.Abort()。真的。很少有使用它的正当理由。您应该使用一种机制(例如AutoResetEvent等)来允许线程自己正常关闭。 -
你能告诉我们你在哪里中止线程并关闭连接的部分吗?
-
不清楚你的线程是在哪里创建的?流产时你的线程在做什么?看来您正在使用套接字的异步 API。没有充分的理由使用线程,我也没有看到。您在哪里创建线程以及它的作用是什么?
-
Thread.Abort是不可预测的,对于像这样的 可管理 情况应避免使用。看看如何使用 TPL 执行Task Cancellation。 -
正如@SriramSakthivel 所说。你不需要线程。您可以异步执行所有单线程操作。 Please read Stephen Cleary's post on the subject.
标签: c# multithreading sockets dispose