2009-12-17 26 views
0

我正在处理一个WPF应用程序,它有几个线程在后台处理信息。如果其中一个线程崩溃,它会关闭应用程序。我将通过在try/catch中传递给threadstart的函数来纠正这个问题。简单的后台线程在.NET中重新启动

但是,我想知道如果我能做得更好。应该可以编写一个简单的函数,如果失败,它将重新启动一个线程。甚至可以将一些规则立即尝试重新启动,然后延迟后续的重新启动尝试,这将非常简单。基本上,它将作为单线程的非常基本的服务控制管理器。

注意:通过“重启”,我的意思是在新线程上再次调用该方法。

这种方法有什么问题吗? 在我自己写这篇文章之前,有没有我应该评估的现有解决方案?

我只问,因为这似乎不是一个新问题。

+0

我想我应该注意到,在这种特殊情况下,如果我重新启动线程,他们很可能不会再次失败。它们主要是数据收集器,所以当它们重新启动时,“情况”会发生变化。显然,崩溃是应该在代码中修复的问题,但这是针对“异常”的。 – 2009-12-17 18:07:27

回答

1

我认为这里有一个更根本的问题:

如果当它第一次运行时,机会是,如果你把它以同样的方式使用相同的数据,它会抛出同样的异常的线程抛出。重新运行刚刚失败的完全相同的东西通常不是一个好主意。

如果异常真的是由第二次不会发生的事情引起的,那么重试就没有问题。然而,没有什么理由产生一个新线程 - 只要你的线程(在try/catch中)重试这个操作。您可以在一个简单的循环很容易地做到这一点 - 一个天真的实现(不推荐这个,因为它可能永远不会结束,但它可以给你正确的想法)可能是:

bool failed = false; 
do 
{ 
    try 
    { 
     failed = false; 
     DoDangerousOperation(); 
    } 
    catch(MyException e) 
    { 
     failed = true; 
    } 
} while (failed); 

如果不是,有您应该尝试调试一些其他问题,这很可能是由多线程引起的细微竞争条件。

0

你确实需要围绕所有线程入口点进行try/catch以防止崩溃。这包括对Thread.Start,ThreadPool.QueueUserWorkItem,BeginInvoke,异步回调等的调用。另外,不要忘记终结器,错误也会导致应用程序崩溃。

至于“重新启动”该线程,这可能是非常危险的。对所有线程进行处理意味着你不会知道已经发生了什么,或者应用程序处于什么状态,并且可以将首先导致异常的任何问题复合化。除非例外是暂时的,例如网络或基于资源,否则它也不可能成功。

针对特定类型的操作可能会暂时出错,有针对性的重试很有用。

相关问题