另一种选择是将 task2 和 task3 转换为嵌套任务,仅在满足条件时执行它们。
假设 DoSomeMoreWork 返回 true 来执行此操作,您可以编写类似这样的内容
var task1 = Task.Factory.StartNew(DoSomeWork);
var task2 = task1.ContinueWith(result =>
{
if (DoSomeMoreWork())
{
Task.Factory.StartNew(DoFinalWork, TaskCreationOptions.AttachedToParent);
}
}, TaskContinuationOptions.OnlyOnRanToCompletion);
如果您可以使用 Async CTP 或 .NET 4.5(我认为两者都有 Go Live 许可证),您可以用 async/await 替换延续,以获得更简洁的代码。
如果您将工作函数转换为使用异步,您的代码将变得几乎与同步版本一样清晰:
private static async void WorkAsync()
{
await DoSomeWork();
if (await DoSomeMoreWork())
{
await DoFinalWork();
}
}
private static async Task DoFinalWork()
{
Console.WriteLine("Completed");
}
private static async Task<bool> DoSomeMoreWork()
{
Console.WriteLine("Some More");
return true;
}
private static async Task DoSomeWork()
{
Console.WriteLine("Some");
}
如果您不想从方法中返回任务,可以使用以下代码:
private static async void WorkAsync()
{
await Task.Run(()=>DoSomeWork());
if (await Task.Run(()=>DoSomeMoreWork()))
{
await Task.Run(()=>DoFinalWork());
}
}