Task.WhenAllを利用している場合のタイムアウト処理の書き方 (Task.WhenAll, Task.WhenAny, Task.Delay)
var t1Result = 0;
var t2Result = 0;
var t1 = Task.Run(() =>
{
Thread.Sleep(TimeSpan.FromSeconds(1));
Interlocked.Increment(ref t1Result);
});
var t2 = Task.Run(() =>
{
Thread.Sleep(TimeSpan.FromSeconds(3));
Interlocked.Increment(ref t2Result);
});
var tasks = Task.WhenAll(t1, t2);
var timeout = Task.Delay(TimeSpan.FromSeconds(2));
// 処理が完了するか、タイムアウトするまで待つ
await Task.WhenAny(tasks, timeout);
if (t1Result == 1 && t2Result == 1)
{
"処理完了".Dump();
}
else
{
"タイムアウト".Dump();
}