teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

表現をわかりやすく変更

2020/08/24 10:54

投稿

GlassGrass
GlassGrass

スコア52

answer CHANGED
@@ -74,7 +74,7 @@
74
74
 
75
75
  - 多くの場合はフレームワークがスレッドプールの中からよしなに実行スレッドを選択します。
76
76
  上記の例でも、`await`以降の処理がスレッド4に移されていることがわかります。
77
- - 呼び出し元のスレッドが同期コンテキスト(≒メッセージループ)を持っており、かつ`await`時ConfigureAwait設定が`true`の場合、呼び出し元スレッドで実行します。例えばWin32であればメッセージキューに`await`以降の処理を積み直すということをします。
77
+ - 呼び出し元のスレッドが同期コンテキスト(≒メッセージループ)を持っており、かつ`await`時に`ConfigureAwait(false)`を**設定していない**場合、呼び出し元スレッドで実行します。例えばWin32であればメッセージキューに`await`以降の処理を積み直すということをします。
78
78
  この場合、例のように`.Wait()`すると、メッセージループをブロックしたまま後続メッセージを待機するという処理になってしまい、結果デッドロックを生じます。
79
79
 
80
80
  GUIアプリケーションでは`await`以降の処理がUIスレッドで実行されるかワーカースレッドで実行されるかを常に意識するようにするとコードを理解しやすくなるのではと思います。

1

表記ゆれの校正

2020/08/24 10:54

投稿

GlassGrass
GlassGrass

スコア52

answer CHANGED
@@ -70,7 +70,7 @@
70
70
 
71
71
  ----
72
72
 
73
- さて、`await`以降の処理がFuture化され他所のスレッドで実行されると言いましたが、ここで使われるスレッドは実は条件次第で異なります。
73
+ さて、`await`以降の処理がFuture化されスレッドで実行されると言いましたが、ここで使われるスレッドは実は条件次第で異なります。
74
74
 
75
75
  - 多くの場合はフレームワークがスレッドプールの中からよしなに実行スレッドを選択します。
76
76
  上記の例でも、`await`以降の処理がスレッド4に移されていることがわかります。