以干净的方式完成多线程应用程序的最佳方法是什么?
我在单独的套接字中从主线程启动几个套接字连接,并在主线程中等到我的工作日结束,并使用当前System.Environment.Exit(0)
来终止它。
这会导致其中一个孩子出现未处理的异常。我应该停止列表中的线程吗?我一直不愿意在孩子们中实施任何真正的停顿,因此我想知道最好的做法。套接字都很好地包装了适当的析构函数,用于注销和关闭,但它仍然会导致错误。
答案 0 :(得分:4)
答案 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();