backgroundWorker的目的是什么? (我可以获得一些示例代码来理解吗?)

backgroundWorker的目的是什么? (我可以获得一些示例代码来理解吗?)

提前致谢

后台工作线程可以帮助将长时间运行的函数调用卸载到后台,以便接口不会冻结。

假设您在单击按钮时需要花费5秒的时间进行计算。 在此期间,界面将显示为“冻结”:您将无法与其进行交互。

如果您使用后台工作线程,则按钮事件将设置工作线程并立即返回。 这将允许界面继续接受新事件,如其他按钮点击。

至于这里的代码是2个例子:

这里界面将冻结

protected void OnClick( object sender, EventArgs e ) { CallLongRunningFunction(); // will take 5 seconds } 

在这里,它不会因为OnClick将立即返回而且长时间运行的函数将在另一个线程中执行。

 protected void OnClick( object sender, EventArgs e ) { BackgroundWorker bg = new BackgroundWorker(); bg.DoWork += new DoWorkEventHandler(bg_DoWork); bg.RunWorkerAsync(); } void bg_DoWork(object sender, DoWorkEventArgs e) { BackgroundWorker worker = sender as BackgroundWorker; CallLongRunningFunction(); // will take 5 secs } 

行为上的差异是因为对后台工作线程的调用不会在与接口相同的线程中执行,从而释放它以继续其正常工作。

BackgroundWorker旨在让您在单独的线程上运行重或长操作到UI的操作。 如果您要在UI线程上运行一个冗长的进程,那么您的UI很可能会冻结,直到该进程完成。

但是, BackgroundWorker更进一步,为您简化了线程处理过程。 如果您要创建自己的线程来运行繁重或冗长的进程,则需要使用委托来访问UI线程以更新进度条。 使用BackgroundWorker,您不需要任何委托,因为BackgroundWorkerProgressChanged事件已经在UI线程上运行,您可以在那里添加UI更新代码。

要启动BackgroundWorker,您需要调用RunWorkerAsync()

 this.backgroundWorker.RunWorkerAsync(); 

要手动停止它,请调用CancelAsync()

 this.backgroundWorker.CancelAsync(); 

然后从DoWork事件中检查CancellationPending属性,如下例所示:

 private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e) { // Example heavy operation for (int i = 0; i <= 999999; i++) { // Sleep for 10ms to simulate work System.Threading.Thread.Sleep(10); // Report the progress now this.backgroundWorker.ReportProgress(i); // Cancel process if it was flagged to be stopped. if (this.backgroundWorker.CancellationPending) { e.Cancel = true; return; } } } 

我写了一篇关于如何在我的博客上使用BackgroundWorker的文章。 您可以在此处查看: 在C#中使用BackgroundWorker组件

它通过使用线程在后台工作。

在背景中做工作? 🙂

来自MSDN :

BackgroundWorker类允许您在单独的专用线程上运行操作。 下载和数据库事务等耗时的操作可能会导致用户界面(UI)在运行时停止响应。 当您需要响应式UI并且遇到与此类操作相关的长时间延迟时,BackgroundWorker类提供了一种方便的解决方案。

同一页面也有一个广泛的例子。 这是另一个体面的教程。

BackgroundWorker类的目的是为您提供在单独的线程上运行操作的简便方法。

它抽象了线程创建和监视过程,为您提供事件驱动的API来报告操作进度 ( ProgressChanged )并确定操作何时完成( RunWorkerCompleted )。

当您需要运行耗时的任务(可能导致UI看起来没有响应)时非常有用。

MSDN文档有一个C#代码示例,说明了后台工作者的工作以及如何使用它。

http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx