多线程 - 程序结束时的清理策略

时间:2010-03-12 14:29:38

标签: c# multithreading termination

以干净的方式完成多线程应用程序的最佳方法是什么? 我在单独的套接字中从主线程启动几个套接字连接,并在主线程中等到我的工作日结束,并使用当前System.Environment.Exit(0)来终止它。

这会导致其中一个孩子出现未处理的异常。我应该停止列表中的线程吗?我一直不愿意在孩子们中实施任何真正的停顿,因此我想知道最好的做法。套接字都很好地包装了适当的析构函数,用于注销和关闭,但它仍然会导致错误。

3 个答案:

答案 0 :(得分:4)

看看jon skeet关于多线程的文章:

http://www.yoda.arachsys.com/csharp/threads/

特别是“优雅地关闭工作线程”:

http://www.yoda.arachsys.com/csharp/threads/shutdown.shtml

答案 1 :(得分:2)

对于manualy创建的线程,您应该将IsBackground属性设置为true。在这种情况下(如果你的所有线程除了主线程之外)都是后台的,你从Main(string [] arg)函数返回后应用程序正常关闭。

P.S。所有线程池线程都是后台。

答案 2 :(得分:0)

每当您执行长时间阻塞等待(例如等待传入连接)时,请使用方法的“开始/结束”表单。然后使用ManualResetEvent表示'should exit'条件。然后阻止AsyncWaitHandle和退出事件。这将允许您干净地终止。

示例:

// exit is a ManualResetEvent
var asyncResult = socket.BeginAccept(null, null);
if(WaitHandle.WaitAny(new[] { exit, asyncResult.AsyncWaitHandle }) == 0)
   return;
var connection = socket.EndAccept(asyncResult);

在您想要退出的主要方法中:

exit.Set();