c# - 等待BackgroundWorker完成?

标签 c# .net multithreading visual-studio-2010 backgroundworker

我有2个异步进程,一个又一个(一个是XML创建backgroundworker,另一个是使用在第一个进程中创建的XML文件的稀疏BW)需要被一个接一个地调用。这些线程的主要原因是停止UI冻结并通过进度条提供状态更新-因为这种同步方法是不希望的/不可能的。

if (!CreateXMLBW.IsBusy)
{
CreateXMLBW.RunWorkerAsync("");
}
if (!CreateRarBW.IsBusy)
{
CreateRarBW.RunWorkerAsync();
}

我不能将第二个BW放在第一个BW的完成事件中,因为可以单独使用这些流程,因此,如果我只想创建XML文件,则可以这样做。

我尝试使用AutoResetEventWaitOne,但是(无论出于何种原因)仍然无法正常工作。

还有什么其他方法可以等待BW完成而不冻结主UI线程?

最佳答案

您的方案正是Task设计的目的。在您的特定情况下,您的代码可能如下所示:

public delegate void UpdateUI(int progress);

private void RunOneAfterAnotherAsync()
{
    Task<XmlElement> task = Task.Factory.StartNew<XmlElement>(CreateXMLBW);
    task.ContinueWith(CreateRarBW);
}

private XmlElement CreateXMLBW()
{
    // your code

    // progress
    progressBar1.Invoke((UpdateUI)UpdateProgressBar, new object[] {progressValue});

    // result
    XmlDocument doc = new XmlDocument();
    return doc.CreateElement("element");
}

private void CreateRarBW(Task<XmlElement> task)
{
    CreateRarBW(task.Result);
}

private void CreateRarBW(XmlElement arg)
{
    // your code
}

public void UpdateProgressBar(int value)
{
    this.progressBar1.Value = value;
}
RunOneAfterAnotherAsync没有被阻止,您的2个方法一个接一个地异步运行。 CreateRarBW仅在CreateXMLBW毫无异常(exception)地结束的情况下运行,但是您可以通过在ContinueWith中使用其他参数来更改它。

您可以做的比本示例显示的要多得多-我鼓励您探索Task类。

编辑

我将示例扩展了一点,以将结果从第一个任务传递到第二个任务。还添加了UI进度示例。

关于c# - 等待BackgroundWorker完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10650137/

相关文章:

c# - 如何在 C# 中创建真人快打游戏?

c# - 在 C# 中确定调用对象类型

c# - 将 SslStream 与 IOCP 结合使用

c# - .NET:TextBox 的 TextChanged 事件并不总是触发,即使 KeyUp 和 KeyDown 正在触发

JAVA - 多线程服务器 - 接收和发送之间的滞后

java - 如何让一个客户端线程 hibernate ,以便另一个客户端执行?

multithreading - 逆向多线程错误

c# - .NET NetworkStream读取速度慢

c# - 新关键词混淆

.net - .NET core 如何在多种环境中运行?