13,007
回編集
197行目: | 197行目: | ||
== ConfigureAwait(false) == | == ConfigureAwait(false) == | ||
GUIアプリケーションにおいて、<code>Wait</code>メソッドおよび<code>Result</code>メソッドを使用する場合、デッドロックが発生する。<br> | |||
これは、<code>Task</code>クラスの<code>Wait</code>メソッドや<code>Result</code>メソッドは、元のスレッドへ戻るからである。<br> | |||
<br> | <br> | ||
以下の例では、まず、methodAsync().Wait()を実行した時点で親スレッドがスリープする。<br> | |||
次に、methodAsyncメソッドの完了後、親スレッドに戻る時、既に親スレッドがスリープしているため、処理を続けることができない。<br> | |||
そのため、親スレッドは子スレッドを待ち続け、子スレッドは親スレッドに戻ろうとして、デッドロックが発生する。<br> | |||
<syntaxhighlight lang="c#"> | <syntaxhighlight lang="c#"> | ||
// デッドロックが起きるサンプルコード(GUIアプリケーションのみ) | // デッドロックが起きるサンプルコード(GUIアプリケーションのみ) | ||
218行目: | 217行目: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<br> | <br> | ||
対策として、<code>ConfigureAwait(false)</code>を使用するとデッドロックが回避できる。<br> | |||
<br> | |||
<code>ConfigureAwait(false)</code>は、メソッドの終了後に親スレッド(呼び出し元)に戻らなくてもよいことを指定する。<br> | |||
ブロックされたスレッドに戻らなくなるため、methodAsyncメソッドが終了した時にcallMethodメソッドに戻ることができる。<br> | |||
<syntaxhighlight lang="c#"> | <syntaxhighlight lang="c#"> | ||
// デッドロックが起きないサンプルコード(GUIアプリケーションのみ) | // デッドロックが起きないサンプルコード(GUIアプリケーションのみ) |