12,796
回編集
細 (Wiki がページ「マルチスレッドの使用方法(C Sharp)」を「C Sharpの基礎 - マルチスレッド」に、リダイレクトを残さずに移動しました) |
|||
47行目: | 47行目: | ||
return await taskAll.ConfigureAwait(false); | return await taskAll.ConfigureAwait(false); | ||
} | } | ||
</syntaxhighlight> | |||
<br><br> | |||
== Wait / Result == | |||
コンソールソフトウェアにおいて、<code>Wait</code>メソッドおよび<code>Result</code>メソッドを使用して、非同期メソッドを作成することができる。<br> | |||
<syntaxhighlight lang="c#"> | |||
HttpClient hc = new HttpClient(); | |||
string html = hc.GetStringAsync("http://example.jp/").Result; | |||
</syntaxhighlight> | |||
<br> | |||
また、<code>Wait</code>メソッドおよび<code>Result</code>メソッド以外に、<code>WaitAll</code>メソッドや<code>WaitAny</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/"); | |||
// タスクが終わるまでスレッドをブロック | |||
t1.Wait(); | |||
// タスクが終わるまでスレッドをブロックして結果を取得 | |||
string binghtml = t2.Result; | |||
// どれかのタスクが終わるまでスレッドをブロック | |||
int completedTaskIndex = Task.WaitAny(t1, t2); | |||
// 0 : タスクt1の方が速い場合 | |||
// 1 : タスクt2の方が速い場合 | |||
// どれかのタスクが終わるまでスレッドをブロック(タイムアウトあり) | |||
int completedTaskIndex2 = Task.WaitAny(new[] { t1, t2 }, 50); | |||
// 0 : タスクt1の方が速い場合 | |||
// 1 : タスクt2の方が速い場合 | |||
// -1 : タスクt1およびt2とも50[ms]以内に応答がない場合 | |||
// 全てタスクが終わるまでスレッドをブロック | |||
Task.WaitAll(t1, t2); | |||
// 全てのタスクが終わるまでスレッドをブロック(タイムアウトあり) | |||
bool allTasksCompleted = Task.WaitAll(new[] { t1, t2 }, 50); | |||
// true : タスクt1およびt2とも50[ms]以内に応答がある場合 | |||
// false : タスクt1またはt2のいずれか一方、または、タスクt1およびt2とも50[ms]以内に応答がない場合 | |||
</syntaxhighlight> | </syntaxhighlight> | ||
<br><br> | <br><br> |