以干净的方式完成多线程应用程序的最佳方法是什么?
我正在从单独的套接字中的主线程开始几个套接字连接,并在主线程中等到我的工作日结束,并使用当前System.Environment.Exit(0)
来终止它。
这导致其中一个孩子出现未处理的异常。我应该停止列表中的线程吗?我一直不愿意在孩子身上实施任何真正的停止,因此我想知道最佳实践。套接字都用适当的析构函数很好地包装了注销和关闭,但它仍然会导致错误。
以干净的方式完成多线程应用程序的最佳方法是什么?
我正在从单独的套接字中的主线程开始几个套接字连接,并在主线程中等到我的工作日结束,并使用当前System.Environment.Exit(0)
来终止它。
这导致其中一个孩子出现未处理的异常。我应该停止列表中的线程吗?我一直不愿意在孩子身上实施任何真正的停止,因此我想知道最佳实践。套接字都用适当的析构函数很好地包装了注销和关闭,但它仍然会导致错误。
对于手动创建的线程,您应该将IsBackground属性设置为 true。在这种情况下(如果除主线程之外的所有线程)都是后台线程,您的应用程序在从 Main(string[] arg) 函数返回后优雅地关闭。
PS所有线程池线程都是后台。
每当您进行长时间阻塞等待(例如等待传入连接)时,请使用该方法的 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();