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

回答編集履歴

2

追記

2020/09/19 07:40

投稿

退会済みユーザー
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
- 「思います」と言うだけでは何なので、Windows Forms アプリで以下のコードを書いて検証てみまたがコメントにデッドロックと書いた方(質問者さんの例では後者の方はデッドロックになます。
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

訂正

2020/09/19 07:40

投稿

退会済みユーザー
answer CHANGED
@@ -7,7 +7,7 @@
7
7
  ・・・に返事がないのではっきりしませんが、「メインスレッドが止まるか止まらないか」を気にしているということは多分 Windows Forms のような GUI アプリで、fuga は Task<string> を返す以下のようなメソッドであろうと想像してレスします。
8
8
 
9
9
  ```
10
- static async Task<string> fuga()
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
- static async Task<string> TimeCosumingMethod()
53
+ private async Task<string> TimeCosumingMethod()
54
54
  {
55
55
  await Task.Delay(3000);
56
56
  return "TimeCosumingMethod の戻り値";