回答編集履歴
2
追記
answer
CHANGED
@@ -16,10 +16,12 @@
|
|
16
16
|
|
17
17
|
> asyncメソッドを使用した時のawaitとResultの違いは両方処理が終わるのは待つがメインスレッドが止まるか止まらないかの違いということでよいのですか。
|
18
18
|
|
19
|
-
前者の async / await を使った方は await で fuga の処理が終わるのを待ちますがメッセージループは処理されるので GUI はフリーズし
|
19
|
+
前者の async / await を使った方は await で fuga の処理が終わるのを待ちますがメッセージループは処理されるので GUI はフリーズしません。それはたぶん質問者さんが期待する動きになると思います。
|
20
20
|
|
21
|
-
|
21
|
+
しかし、質問者さんのコードの後者の Task.Result を使った方はデッドロックになると思います。
|
22
22
|
|
23
|
+
「思います」と言うだけでは説得力がないので、Windows Forms アプリで以下のコードを書いて検証してみました。コメントにデッドロックと書いた方(質問者さんの例では後者の方)はデッドロックになります。
|
24
|
+
|
23
25
|
```
|
24
26
|
using System;
|
25
27
|
using System.Threading.Tasks;
|
@@ -35,6 +37,9 @@
|
|
35
37
|
}
|
36
38
|
|
37
39
|
// デッドロック
|
40
|
+
// Task.Result プロパティの get アクセサーにアクセスすると
|
41
|
+
// 非同期操作が完了するまで呼び出し元のスレッドがブロックされる。
|
42
|
+
// これは、Wait メソッドを呼び出すことと同じ
|
38
43
|
private void button1_Click(object sender, EventArgs e)
|
39
44
|
{
|
40
45
|
label1.Text = "";
|
1
訂正
answer
CHANGED
@@ -7,7 +7,7 @@
|
|
7
7
|
・・・に返事がないのではっきりしませんが、「メインスレッドが止まるか止まらないか」を気にしているということは多分 Windows Forms のような GUI アプリで、fuga は Task<string> を返す以下のようなメソッドであろうと想像してレスします。
|
8
8
|
|
9
9
|
```
|
10
|
-
|
10
|
+
private async Task<string> fuga()
|
11
11
|
{
|
12
12
|
await Task.Delay(3000);
|
13
13
|
return "戻り値";
|
@@ -50,7 +50,7 @@
|
|
50
50
|
label1.Text = str;
|
51
51
|
}
|
52
52
|
|
53
|
-
|
53
|
+
private async Task<string> TimeCosumingMethod()
|
54
54
|
{
|
55
55
|
await Task.Delay(3000);
|
56
56
|
return "TimeCosumingMethod の戻り値";
|