「C Sharpの基礎 - マルチスレッド」の版間の差分

ナビゲーションに移動 検索に移動
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>

案内メニュー