我正在开发一个WPF应用程序,它有一些在后台处理信息的线程。如果其中一个线程崩溃,它会关闭应用程序。我将通过在try / catch中包装传递给threadstart的函数来纠正它。
然而,我想知道我是否能做得更好。应该可以编写一个简单的函数,如果失败,它将重新启动一个线程。即使放入一些规则来立即尝试重启,然后延迟后续重启尝试也会非常简单。基本上,它将作为单个线程的非常基本的服务控制管理器。
注意:通过“重启”,我的意思是在新线程上再次调用该方法。
这种方法有问题吗? 在我自己写这篇文章之前,我是否有任何现有的解决方案?
我只是问,因为这似乎不是一个新问题。
答案 0 :(得分:1)
我认为这里有一个更基本的问题:
如果线程在第一次运行时抛出,如果您使用相同的数据以相同的方式调用它,它可能会抛出相同的异常。重新尝试完全失败的事情通常不是一个好主意。
如果异常确实是由第二次不会发生的事情引起的,那么重试就没有问题。但是,没有理由产生一个新线程 - 只需让你的线程(在它的try / catch中)重试该操作。你可以通过一个简单的循环轻松地做到这一点 - 一个天真的实现(不建议这样做,因为它可能永远不会结束,但它可以给你正确的想法)可能是:
bool failed = false;
do
{
try
{
failed = false;
DoDangerousOperation();
}
catch(MyException e)
{
failed = true;
}
} while (failed);
如果没有,你应该尝试调试一些其他问题,很可能是你的多线程引起的一种微妙的竞争条件。
答案 1 :(得分:0)
您需要对所有线程入口点进行try / catch以防止崩溃。这包括对Thread.Start,ThreadPool.QueueUserWorkItem,BeginInvoke,异步回调等的调用。另外不要忘记终结器,错误也会使应用程序崩溃。
到目前为止,“重新启动”线程,这可能非常危险。对所有线程执行此操作意味着您将不知道已经发生了什么或应用程序处于什么状态,并且您可以复合引起异常的任何问题。除非例外是临时的,例如网络或基于资源,否则它也不太可能成功。
对于可能暂时出错的特定类型的操作,有针对性的重试很有用。