[英]Wait for BackgroundWorker to complete?
我有2个异步进程需要一个接一个地调用(一个是XML创建backgroundworker
工作者,另一个是使用在第一个进程中创建的XML文件的raring BW)。 这些线程的主要原因是停止UI冻结并通过进度条的方式提供状态更新 - 因为这样的同步方法是不可取的/不可能的。
if (!CreateXMLBW.IsBusy)
{
CreateXMLBW.RunWorkerAsync("");
}
if (!CreateRarBW.IsBusy)
{
CreateRarBW.RunWorkerAsync();
}
我不能将第二个BW放在第一个完成事件中,因为这些进程可以单独使用,因此如果我只想创建XML文件,我可以这样做。
我尝试过使用AutoResetEvent
和WaitOne
但是这(无论出于何种原因)仍然无效。
有没有其他方法可以等待BW完成而不冻结主UI线程?
如果你不想要阻止UI直到等待事件(所以我想你会做某事)你可以在DoWork()
结束时引发事件,并且UI线程可以接收它。
如果您使用的是4.0并且可以避免使用BackgroundWorker,则可以使用TPL中的Task.ContinueWith 。
伪代码可能如下所示:
Action action =(() => DoWorkMethod());
Task.Factory.StartNew(() => action()).ContinueWith(()=>CallAfterComplete());
您还可以使用此示例中的任务 :
class Program
{
static XElement CreateXml()
{
System.Threading.Thread.Sleep(1000);
return XElement.Parse(@"<FooBar>Hi!</FooBar>");
}
static void ProceedXml(XElement xml)
{
System.Threading.Thread.Sleep(1000);
Console.WriteLine(xml.ToString());
}
public static void Main()
{
Task.Factory.StartNew<XElement>(CreateXml)
.ContinueWith(t => ProceedXml(t.Result));
Console.ReadKey();
}
}
您的方案正是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
也不例外结束,但你可以通过使用额外的参数更改ContinueWith
。
您可以做的远不止这个示例节目 - 我鼓励您探索Task类。
编辑
我稍微扩展了一些示例,以便将从第一个任务传递到第二个任务的结果合并到第二个任务中。 还添加了UI进度示例。
您的UI可以处理第一个BW上的RunWorkerCompleted事件并调用第二个BW。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.