「C#プログラム」を選択してLINQPadでバージョンを作成しました。これは、2行の出力でコンパイルおよび実行され、タイムアウトと成功の両方のケースを示しています。
00:00:05のタイムアウトが期限切れになりました
fooの結果を正常に取得しました
スニペットは次のとおりです。
void Main()
{
CallGetStringWithTimeout(TimeSpan.FromSeconds(5), TimeSpan.FromSeconds(10)).Wait();
CallGetStringWithTimeout(TimeSpan.FromSeconds(5), TimeSpan.FromSeconds(0)).Wait();
}
public async Task CallGetStringWithTimeout(TimeSpan callTimeout, TimeSpan callAddedDelay)
{
var myTask = GetStringAsync(callAddedDelay);
await Task.WhenAny(Task.Delay(callTimeout), myTask);
if (myTask.Status == TaskStatus.RanToCompletion)
{
Console.WriteLine ("Successfully got result of {0}", await myTask);
}
else
{
Console.WriteLine ("Timeout of {0} expired", callTimeout);
}
}
public async Task<string> GetStringAsync(TimeSpan addedDelay)
{
await Task.Delay(addedDelay);
return "foo";
}
ただし、「通常の」方法は、CancellationTokenSourceを使用し、タイムアウトをctorparamとして指定することです。すでにCancellationTokenSourceがある場合は、その上でCancelAfterメソッドを呼び出すことができます。これにより、指定されたタイムアウトのキャンセルがスケジュールされます。