もう1つのオプションは、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);
AsyncCTPまたは.NET4.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());
}
}