回答編集履歴

2

追記

2022/09/12 00:24

投稿

退会済みユーザー
test CHANGED
@@ -4,3 +4,52 @@
4
4
  https://docs.microsoft.com/ja-jp/archive/msdn-magazine/2013/march/async-await-best-practices-in-asynchronous-programming
5
5
 
6
6
  「async void を避ける」と「すべて非同期にする」・・・できてないですよね。特に後者が問題。
7
+
8
+ ---
9
+
10
+ **【追記】**
11
+
12
+ 具体的にどう直せばいいかを追記しておきます。
13
+
14
+ **(1) すべて非同期にする**
15
+
16
+ "上から下に (または下から上に) 非同期コードが他の非同期コードを呼び出す"
17
+
18
+ ⇒ button1_Click, Main も async/await を付与して非同期メソッドにします。
19
+
20
+ **(2) async void を避ける**
21
+
22
+ "async メソッドで自然な戻り値の型は Task と Task<T> だけです"
23
+
24
+ ⇒ 戻り値がない場合は async Task とします。ただしイベントハンドラは例外で、async void とするほかありませんので注意。
25
+
26
+
27
+ 質問者さんのコードを上の (1), (2) に従って書き換えると以下のようになります(注: button1 ⇒ button3、Main ⇒ Test、Console ⇒ System.Diagnostics.Debug と変更しています)
28
+
29
+ ```
30
+ private async void button3_Click(object sender, EventArgs e)
31
+ {
32
+ await Test();
33
+ }
34
+
35
+ private async Task Test()
36
+ {
37
+ await TaskSample();
38
+ System.Diagnostics.Debug.WriteLine("test");
39
+ }
40
+
41
+ private async Task TaskSample()
42
+ {
43
+ await Task.Run(() => SubTask1());
44
+ System.Diagnostics.Debug.WriteLine("Taskおわり");
45
+ }
46
+
47
+ private void SubTask1()
48
+ {
49
+ Thread.Sleep(10000);
50
+ }
51
+ ```
52
+
53
+ 結果は:
54
+
55
+ ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2022-09-12/57b07238-5c85-4fee-9891-c491c4b7d782.jpeg)

1

追記

2022/09/11 14:23

投稿

退会済みユーザー
test CHANGED
@@ -3,4 +3,4 @@
3
3
  非同期プログラミングのベスト プラクティス
4
4
  https://docs.microsoft.com/ja-jp/archive/msdn-magazine/2013/march/async-await-best-practices-in-asynchronous-programming
5
5
 
6
- 「async void を避ける」と「すべて非同期にする」・・・できてないですよね。
6
+ 「async void を避ける」と「すべて非同期にする」・・・できてないですよね。特に後者が問題。