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

C# backgroundWorker的目的是什么?(我可以得到一些示例代码来理解吗?),c#,C#,backgroundWorker的目的是什么?(我可以得到一些示例代码来理解吗?) thank's Prevance它通过使用在后台工作。MSDN文档中有一个C代码示例,说明backgroundworker做什么以及如何使用它 要做工作。。。在后台?:) 发件人: BackgroundWorker类允许您 要在单独的服务器上运行操作, 专用线程。费时的 下载和数据库等操作 事务可能会导致您的用户 界面(UI)看起来好像 已停止响应 跑步当你想要一个响应性强的用户界面时 你面临着长时间的拖延 与此

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


thank's Prevance

它通过使用在后台工作。

MSDN文档中有一个C代码示例,说明backgroundworker做什么以及如何使用它


要做工作。。。在后台?:)

发件人:

BackgroundWorker类允许您 要在单独的服务器上运行操作, 专用线程。费时的 下载和数据库等操作 事务可能会导致您的用户 界面(UI)看起来好像 已停止响应 跑步当你想要一个响应性强的用户界面时 你面临着长时间的拖延 与此类操作相关联的 BackgroundWorker类提供了 方便的解决方案


还有一个广泛的例子这是另一个不错的教程。

后台工作线程有助于将长时间运行的函数调用卸载到后台,这样界面就不会冻结

假设当你点击一个按钮时,你有需要5秒来计算的东西。在此期间,界面将显示为“冻结”:您将无法与其交互

如果改用后台工作线程,按钮事件将设置工作线程并立即返回。这将允许界面像其他按钮单击一样不断接受新事件

就代码而言,这里有两个示例:

在这里,界面将冻结

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类的目的是为您提供一种在单独线程上运行操作的简便方法

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

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

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;
        }
    }
}
private void backgroundWorker\u DoWork(对象发送方,DoWorkEventArgs e)
{
//重型作业示例

对于(int i=0;i)来说,基本的想法是你先四处搜索,尝试一些东西,然后,如果你陷入困境,你会在这里问一个问题,包括一些细节。我相信StackOverflow的要点之一就是要有“最终的谷歌搜索答案”.即使这个问题的答案可以通过阅读文档得到,并且这个问题可以用更多的细节来表达,但我个人并不介意在这里提出这样的问题,因为你会得到类似“我将其用于以下…”的答案,这比简单的文档更有价值。阿尔卑斯山,我同意,但如果没有添加“提供复制/粘贴的内容”,问题会好得多。你无法得到答案?最接近“目的是什么”当使用BackgroundWorker时,请确保您提供按钮被按下的视觉反馈。这可以是按钮本身的简单禁用/启用和/或使用OnProgress事件处理程序显示后台线程的进度。还请注意,您的代码需要是线程安全的(请参阅)。