12,796
回編集
89行目: | 89行目: | ||
// true : タスクt1およびt2とも50[ms]以内に応答がある場合 | // true : タスクt1およびt2とも50[ms]以内に応答がある場合 | ||
// false : タスクt1またはt2のいずれか一方、または、タスクt1およびt2とも50[ms]以内に応答がない場合 | // false : タスクt1またはt2のいずれか一方、または、タスクt1およびt2とも50[ms]以内に応答がない場合 | ||
</syntaxhighlight> | |||
<br><br> | |||
== WhenAny == | |||
複数のタスクのうち、いずれか1つのみが完了するまで待機する場合、<code>WhenAny</code>メソッドを使用する。<br> | |||
<syntaxhighlight lang="c#"> | |||
HttpClient hc = new HttpClient(); | |||
Task<string> t1 = hc.GetStringAsync("https://www.microsoft.com/"); | |||
Task<string> t2 = hc.GetStringAsync("https://www.bing.com/"); | |||
Task<string> completedTask = await Task.WhenAny(t1, t2); | |||
</syntaxhighlight> | |||
<br> | |||
これを応用して、処理継続中のタスクをキャンセルすることもできる。<br> | |||
<syntaxhighlight lang="c#"> | |||
HttpClient hc = new HttpClient(); | |||
CancellationTokenSource cts = new CancellationTokenSource(); | |||
// GetStringAsyncメソッドにはCancellationToken構造体を受けるオーバーロードが無いため、GetAsyncメソッドを使用している | |||
Task<HttpResponseMessage> t1 = hc.GetAsync("https://www.microsoft.com/", cts.Token); | |||
Task<HttpResponseMessage> t2 = hc.GetAsync("https://www.bing.com/", cts.Token); | |||
// 完了したタスクを取得 | |||
Task<HttpResponseMessage> completedTask = await Task.WhenAny(t1, t2); | |||
// 他の処理中のタスクは全てキャンセルする | |||
cts.Cancel(); | |||
// 完了したタスクの結果を取得 | |||
HttpResponseMessage msg = await completedTask; | |||
string html = await msg.Content.ReadAsStringAsync(); | |||
</syntaxhighlight> | </syntaxhighlight> | ||
<br><br> | <br><br> |