您的场景正是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 进度示例。