我有一个对我的申请至关重要的工作线程
它是用new Thread( method ).Start();
创建的,我不加入它,我只是希望只要我的程序运行就会运行
但是,可能会发生此线程上发生异常;并且作为一个结果,线程将(除了一些最后的日志记录)关闭。此严重错误无法恢复。由于线程对于应用程序至关重要,因此它也必须关闭。
现在我的问题是:如何监控我的线程状态?
你会吗?IsAlive
属性?AppDomain.CurrentDomain.UnhandledException
?event
来表示我的后台线程的结束?BackgroundWorker
的{{1}}? (但对于长时间运行的线程,BackgroundWorker真的是正确的选择吗?) 修改
现在,我通过致电RunWorkerCompleted
- >解决了这个问题。 早期崩溃,经常。这也是一个选择:)
答案 0 :(得分:2)
为什么不像这样包装你的主线程程序:
void ThreadStart()
{
try
{
ThreadImplementation();
}
catch (Exception e)
{
mainForm.BeginInvoke(OnBackgroundThreadException, e);
}
}
这将确保每当线程异常关闭时,在应用程序的主线程上都会收到消息。您不需要轮询任何内容。当您需要异步地回访UI线程时,BackgroundWorker通常很有用。 (I.E.进展更新)。
答案 1 :(得分:2)
在线程的异常处理程序结束时,在主线程上调用一个回调方法并重新启动worker:
public delegate void AbnormalExitDelegate(object errorArgs);
class Boss
{
Worker worker;
void Start()
{
worker = new Worker();
worker.AbnormalExitCallback = new AbnormalExitDelegate(AbnormalExit);
Thread workerThread = new Thread(worker.DoWork);
workerThread.Start();
}
public void AbnormalExit(object errorArgs)
{
Start();
}
}
class Worker
{
public AbnormalExitDelegate AbnormalExitCallback;
public void DoWork()
{
try
{
// do work here
}
catch (Exception ex)
{
// pass stuff back, like the exception
AbnormalExitCallback(ex);
}
}
}