5

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

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

4

3 回答 3

4

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

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

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

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

于 2010-03-12T14:36:34.960 回答
2

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

PS所有线程池线程都是后台。

于 2010-03-12T15:35:04.730 回答
0

每当您进行长时间阻塞等待(例如等待传入连接)时,请使用该方法的 Begin/End 形式。然后使用 ManualResetEvent 来表示“应该退出”条件。然后阻塞 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();
于 2010-03-12T15:39:14.037 回答