在我的应用程序中,我需要执行一系列初始化步骤,这些步骤需要7-8秒才能完成,在此期间,我的UI变得没有响应。为了解决这个问题,我在一个单独的线程中执行初始化:
public void Initialization()
{
Thread initThread = new Thread(new ThreadStart(InitializationThread));
initThread.Start();
}
public void InitializationThread()
{
outputMessage("Initializing...");
//DO INITIALIZATION
outputMessage("Initialization Complete");
}
我读过一些关于BackgroundWorker
的文章,以及它如何让我的应用程序保持响应性,而不必编写线程来执行冗长的任务,但我还没有成功地尝试实现它,有人能告诉我如何使用BackgroundWorker
来实现吗?
4条答案
按热度按时间bkhjykvo1#
1.添加使用
1.声明Background Worker:
1.订阅事件:
1.实作两个方法:
1.在需要时运行worker async。
1.跟踪进度(可选,但通常很有用)
a)订阅
ProgressChanged
事件并在DoWork
中使用ReportProgress(Int32)
B)设置
worker.WorkerReportsProgress = true;
(将信用额度设置为@zagy)vtwuwzda2#
您可能还想考虑使用
Task
而不是后台工作线程。在您的示例中,最简单的方法是
Task.Run(InitializationThread);
。使用任务而不是后台工作线程有几个好处。例如,.net 4.5中新的async/await特性使用
Task
进行线程化。jvidinwx3#
此外,请参考以下链接,您将了解
Background
的概念:http://www.c-sharpcorner.com/UploadFile/1c8574/threads-in-wpf/
u0njafvf4#
我发现这个(WPF Multithreading: Using the BackgroundWorker and Reporting the Progress to the UI. link)包含了@Andrew的答案中缺少的其余细节。
我发现非常有用的一件事是工作线程不能访问MainWindow的控件(在它自己的方法中),但是当在主窗口事件处理程序中使用委托时,这是可能的。