回答編集履歴

2

大事なこと

2019/02/05 00:35

投稿

tamoto
tamoto

スコア4103

test CHANGED
@@ -20,11 +20,11 @@
20
20
 
21
21
 
22
22
 
23
- ちなみに、前回の質問のコメントで`tasks.foreach(t=>t.Result);`としているのは、その手法をあえて採用する価値が全く無いことは置いといて、「その直前で`await Task.WhenAll(tasks.ToArray());`をしている場合は安全」です。何故かと言うと、`WhenAll`によって「`tasks`の全てのTaskが完全に完了していることが保証されている」からです。これの意味が完全に分かる頃には、どうして`.Result`を使ってはいけないか、どこに`.Result`を使っても安全か、も分かっているはずです。
23
+ ちなみに、前回の質問のコメントで`tasks.ForEach(t=>t.Result);`としているのは、その手法をあえて採用する価値が全く無いことは置いといて、「その直前で`await Task.WhenAll(tasks.ToArray());`をしている場合は安全」です。何故かと言うと、`WhenAll`によって「`tasks`の全てのTaskが完全に完了していることが保証されている」からです。これの意味が完全に分かる頃には、どうして`.Result`を使ってはいけないか、どこに`.Result`を使っても安全か、も分かっているはずです。
24
24
 
25
25
 
26
26
 
27
- 以下に前回の質問のコードの重点を整理しました。**どちらでも同じ結果は得られる**ため、「**あえて推奨されないやり方を選ぶ理由があるならそうすれば良い**」というのが結論ですね。
27
+ 以下に前回の質問のコードの重点を整理しました。**どちらでも同じ結果は得られる**ため、「**あえて推奨されないやり方を選ぶ理由があるならそうすれば良い**」というのが結論ですね。ただし、「`Task.WhenAll`を`await`しない」というのは論外です。
28
28
 
29
29
 
30
30
 
@@ -51,3 +51,29 @@
51
51
  tasks.ForEach(x => x.Result);
52
52
 
53
53
  ```
54
+
55
+
56
+
57
+
58
+
59
+ 論外、デッドロックが発生する可能性がある:
60
+
61
+ ```csharp
62
+
63
+ var result = Task.WhenAll(tasks.ToArray());
64
+
65
+ tasks.ForEach(x => x.Result);
66
+
67
+
68
+
69
+ /*---------------------------------------*/
70
+
71
+
72
+
73
+ var result = Task.WhenAll(tasks.ToArray());
74
+
75
+ foreach (var r in result.Result)
76
+
77
+ Console.WriteLine(r);
78
+
79
+ ```

1

追記

2019/02/05 00:35

投稿

tamoto
tamoto

スコア4103

test CHANGED
@@ -16,4 +16,38 @@
16
16
 
17
17
 
18
18
 
19
+ ---
20
+
21
+
22
+
19
23
  ちなみに、前回の質問のコメントで`tasks.foreach(t=>t.Result);`としているのは、その手法をあえて採用する価値が全く無いことは置いといて、「その直前で`await Task.WhenAll(tasks.ToArray());`をしている場合は安全」です。何故かと言うと、`WhenAll`によって「`tasks`の全てのTaskが完全に完了していることが保証されている」からです。これの意味が完全に分かる頃には、どうして`.Result`を使ってはいけないか、どこに`.Result`を使っても安全か、も分かっているはずです。
24
+
25
+
26
+
27
+ 以下に前回の質問のコードの重点を整理しました。**どちらでも同じ結果は得られる**ため、「**あえて推奨されないやり方を選ぶ理由があるならそうすれば良い**」というのが結論ですね。
28
+
29
+
30
+
31
+ 推奨されるやり方:
32
+
33
+ ```csharp
34
+
35
+ var result = await Task.WhenAll(tasks.ToArray());
36
+
37
+ foreach (var x in result)
38
+
39
+ Console.WriteLine(x);
40
+
41
+ ```
42
+
43
+
44
+
45
+ 推奨されないやり方:
46
+
47
+ ```csharp
48
+
49
+ await Task.WhenAll(tasks.ToArray());
50
+
51
+ tasks.ForEach(x => x.Result);
52
+
53
+ ```