我有一个(非常基本的理解,我认为)关于线程化和中止的问题:
情况是:我在一个线程中有一个打开的套接字连接 - 现在我正在通过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);
答案 0 :(得分:1)
请阅读有关该主题的MSDN文档。
首先。不,你的代码永远不会工作。一次性需要显式调用它们.Dispose()
或者通过using(IDisposable){}
的语法糖来隐式调用它们。
现在查看ThreadAbortException
您可以捕获异常(但它会被重新抛出)。所以using
(由编译器转换为try{}finally{Dispose()}
)将起作用。
但你没有异常处理。