rem*_*rem 8 .net c# wpf multithreading backgroundworker
在WPF应用程序中,我有一个有计算机的数据库访问任务,由计时器定期运行,此任务已在BackgroundWorker线程中执行.
当连接尝试失败时,我通过try_catch构造引发异常,我想更新UI线程中的状态栏文本.
是否有一些prebuild事件构建BackgroundWorker用于实现这一点,类似DoWorkEventHandler或RunWorkerCompletedEventHandler,可用于此?如果没有,怎么做得更好?
编辑(补充):
如果我想在里面处理异常RunWorkerCompletedEventHandler,使用e.Error参数,它不起作用.如果我在BackgroundWorker线程中未处理异常,应用程序挂起并且调试器指向在BackgroundWorker线程内部执行的代码字符串,说:用户代码未处理异常.
因此,在这种情况下,线程不会停止,发出信号RunWorkerCompletedEventHandler,它会因错误而停止,但整个应用程序停止工作.
该RunWorkerCompletedEventArgs e的RunWorkerCompletedEventHandler包含属性Error它的类型是例外的.如果在后台线程的工作期间没有发生异常,则prpery为null.否则它包含发生的错误.
可以使用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)
| 归档时间: |
|
| 查看次数: |
9461 次 |
| 最近记录: |