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

时间:2009-08-17 20:01:35

标签: c#

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

提前谢谢

6 个答案:

答案 0 :(得分:22)

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

假设您单击按钮时需要花费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
}

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

答案 1 :(得分:2)

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

然而, BackgroundWorker 更进一步,为您简化了线程处理过程。如果您要创建自己的线程来运行繁重或冗长的进程,则需要使用委托来访问UI线程以更新进度条。使用 BackgroundWorker ,您不需要任何代理,因为 BackgroundWorker ProgressChanged 事件已在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 的文章。您可以在此处查看:Using the BackgroundWorker Component in C#

答案 2 :(得分:1)

它使用threads在后台运行。

答案 3 :(得分:1)

在后台做工作? :)

来自MSDN

  

BackgroundWorker类允许您   在一个单独的,   专用线程。耗时的   下载和数据库等操作   交易可能会导致您的用户   界面(UI)看起来好像它   他们已经停止了回应   运行。当您需要响应式UI时   你面临着长时间的拖延   与此类操作相关联的   BackgroundWorker类提供了一个   方便的解决方案。

The same page也有一个广泛的例子。 Here是另一个不错的教程。

答案 4 :(得分:1)

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

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

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

答案 5 :(得分:0)

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

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