【发布时间】:2015-05-15 11:51:21
【问题描述】:
我需要向用户显示某种形式的反馈,而后台会发生一个小过程(7-10 秒)。
过去我在 Windows 窗体中使用单独的线程和 BackgroundWorker 没有任何问题,但在 WPF 中证明是困难的。
我已经阅读了很多关于这方面的文章,以及我应该如何在 WPF 中使用调度程序来启动一个新线程等。但是,当我尝试使用 BackgroundWorker 来显示一种等待图像反馈的形式时,它只是保持静止。
我不认为这很重要,但它使用来自 FirstFloor (https://github.com/firstfloorsoftware/mui) 的 mui。
我正在尝试使用内置的 ProgressRing 功能(在同一线程中运行时没有问题,并且没有其他主要任务在后台运行。
添加 BackgroundWorker,由于对象的跨线程访问而带来异常,尽管许多博客声明 WPF 中的 BackgroundWorks 具有跨线程感知能力并且可以安全运行。
以下是生成我需要的最接近的代码。
private async void MyTaskProcess()
{
await Dispatcher.BeginInvoke(DispatcherPriority.Send, new ThreadStart(() =>
{
try
{
//Update the waiting ring image
ProgressRing.IsActive = true;
}
catch
{
ProgressRing.IsActive = false;
MessageBox.Show("Exception Thrown");
}
}));
await Dispatcher.BeginInvoke(DispatcherPriority.Background, new ThreadStart(() =>
{
try
{
//Run the main MS Excel export function
Export2Excel();
ProgressRing.IsActive = false;
}
catch
{
MessageBox.Show("Exception Thrown");
}
}));
}
感谢任何反馈。
【问题讨论】:
-
我认为您需要去阅读更多内容 -
Dispatcher不会启动新线程。相反,它确保代码在 UI 线程上执行!我建议使用Task<T>和async/await查看TPL。BackgroundWorker有点老了,但仍然可以正常工作。 -
查看 MSDN 上的
BackgroundWorkerClass 页面。 -
在使用后台工作线程时,您是否尝试过将 WorkerReportsProgress 设置为 true,并调用 ReportProgress?引发 ProgressChanged 事件时,它会在创建后台工作线程的线程上执行,因此更新 UI 应该没有问题。
标签: c# wpf multithreading