次のコードは、タイムアウトを設定して 2 つのタスクを同時に実行します。
階層タスク (親) には全体的なタイムアウト値があり、この値に達するとプロセスが終了します。
階層タスク内では、多数のノード タスク (子) が同期してループされるため、タスク 1 はタスク 2 に進む前に完了する必要があります。
子タスクが時間枠内に完了しない場合、タイムアウトになり、次の子タスクが実行されます。
親タスクがタイムアウトになると、プロセスは停止しますが、現在未処理の子タスクはバックグラウンドで実行されたままです。子タスクはサードパーティの Web サービスであり、できれば削除してクリーンアップしたいと考えています。
Microsoft の例を見てみましたが、自分のコードで動作させるのに苦労しています。
要するに、タイムアウトまたは例外を介してのみ実行できる親が終了した場合、現在ループ内で実行されている子をキャンセルする必要があります。
これがどのように達成されるかは誰でも知っています。
public int NestedTask(IEnumerable<KeyValuePair<string, int>> nodes)
{
int parentTimeout = 20 * 1000;
int childTimeout = 2 * 1000;
var tier = Task<int>.Factory.StartNew(() =>
{
foreach (var n in nodes)
{
var node = Task<int>.Factory.StartNew(() =>
{
Thread.Sleep(n.Value * 1000);
return 1;
});
// If we get the result we return it, else we wait
if (node.Wait(childTimeout))
{
return node.Result;
}
}
// return timeout node here;
return -1;
});
if (!tier.Wait(parentTimeout))
{
// The child will continue on running though.
** CANCEL SINGLE CHILD ***
return -2;
}
else if (tier.Exception != null)
{
// We have an error
}
return tier.Result;
}