如何处理BackgroundWorker线程中的异常?

rem*_*rem 8 .net c# wpf multithreading backgroundworker

在WPF应用程序中,我有一个有计算机的数据库访问任务,由计时器定期运行,此任务已在BackgroundWorker线程中执行.

当连接尝试失败时,我通过try_catch构造引发异常,我想更新UI线程中的状态栏文本.

是否有一些prebuild事件构建BackgroundWorker用于实现这一点,类似DoWorkEventHandlerRunWorkerCompletedEventHandler,可用于此?如果没有,怎么做得更好?

编辑(补充):

如果我想在里面处理异常RunWorkerCompletedEventHandler,使用e.Error参数,它不起作用.如果我在BackgroundWorker线程中未处理异常,应用程序挂起并且调试器指向在BackgroundWorker线程内部执行的代码字符串,说:用户代码未处理异常.

因此,在这种情况下,线程不会停止,发出信号RunWorkerCompletedEventHandler,它会因错误而停止,但整个应用程序停止工作.

Ior*_*nev 6

RunWorkerCompletedEventArgs eRunWorkerCompletedEventHandler包含属性Error它的类型是例外的.如果在后台线程的工作期间没有发生异常,则prpery为null.否则它包含发生的错误.


Dou*_*son 5

可以使用Dispatcher.BeginInvoke从后台线程更新WPF UI.

例如,如果您的后台代码是Window的一部分,那么您可以更新TextBlock:

this.Dispatcher.BeginInvoke((Action)(() =>
    {
        textBlock.Text = "Connection Failed!";
    }));
Run Code Online (Sandbox Code Playgroud)

编辑:

如果您的后台代码位于Window以外的类中,您可以创建一个界面来帮助:

public interface IShowStatus
{
    void ShowStatus(string message);
}
Run Code Online (Sandbox Code Playgroud)

在Window中实现接口

public void ShowStatus(string message)
{
   this.Dispatcher.BeginInvoke((Action)(() =>
       {
           textBlock.Text = message;
       }));
}
Run Code Online (Sandbox Code Playgroud)

在您的类中,后台工作者创建一个属性来保存对接口的引用.

public IShowStatus StatusDisplay { get; set; }
Run Code Online (Sandbox Code Playgroud)

在Window类中初始化背景类.

public void InitBackground()
{
    BackgroundClass background = new BackgroundClass();
    background.StatusDisplay = this;
    ...
Run Code Online (Sandbox Code Playgroud)

最后在你的后台主题中你可以说:

StatusDisplay.ShowStatus("Connection Failed!");
Run Code Online (Sandbox Code Playgroud)