回答編集履歴

4

訂正

2020/12/27 02:18

投稿

退会済みユーザー
test CHANGED
@@ -36,11 +36,23 @@
36
36
 
37
37
 
38
38
 
39
- 非同期版 InputData.GetRowsAsync(), Master.GetRowsAsync() を使って「試したこと」のコードのようにすると、非同期版メソッドの中で await を使っているでしょうから、それと Task.Result がお互い待機しあってデッドロックに陥るかもしれません。(コンソールアプリは仕組みが違っていてデッドロックにならないので注意)
40
-
41
-
42
-
43
- 非同期メソッド InputData.GetRowsAsync(), Master.GetRowsAsync() に同期バージョンがあればそれを使えば「試したこと」のコードのように WhenAll を使ったコードでもデッドロック問題は無いと思います。下のサンプルコードの button5_Click メソッドを見てください。だし、マルチコアが利用されるかどうかが分かりませんサンプルを作って動かしてみるとそんな感じがしますが、確信が持てないです)
39
+ 【12/27 11:15 訂正】
40
+
41
+
42
+
43
+ ・・・と思いましたが、非同期バージョンのメソッドしかない場合は TPL ではどうしようもないし、UI がブロックされるのは避けられないし、Task.WhenAll(...) await を付与すればデッドロックになることはないので、Parallel.Invoke など使わないで質問者さんの「試したこと」のコードのようにして並列化については OS に任せるが良さそうと思い直した。
44
+
45
+
46
+
47
+ ただ、下の太字で書いたそもそもの話があって、DB が相手であれば、join した SELECT クエリを作ってそれを一回だけ DB に投げてデータを取得するのが正解だと思います。
48
+
49
+
50
+
51
+ ~~非同期版 InputData.GetRowsAsync(), Master.GetRowsAsync() を使って「試したこと」のコードのようにすると、非同期版メソッドの中で await を使っているでしょうから、それと Task.Result がお互い待機しあってデッドロックに陥るかもしれません。(コンソールアプリは仕組みが違っていてデッドロックにならないので注意)~~ 【12/27 11:15 訂正】Task.WhenAll に await が付与されているのを見落としてました。削除します。
52
+
53
+
54
+
55
+ ~~(非同期版メソッド InputData.GetRowsAsync(), Master.GetRowsAsync() に同期バージョンがあれば、それを使えば「試したこと」のコードのように WhenAll を使ったコードでもデッドロックの問題は無いと思います。下のサンプルコードの button5_Click メソッドを見てください。ただし、マルチコアが利用されるかどうかが分かりません。サンプルを作って動かしてみるとそんな感じがしますが、確信が持てないです)~~
44
56
 
45
57
 
46
58
 

3

追記&訂正

2020/12/27 02:18

投稿

退会済みユーザー
test CHANGED
@@ -16,7 +16,7 @@
16
16
 
17
17
 
18
18
 
19
- 質問者さんのコードの GetRowsAsync(), GetRowsAsync() に同期バージョンがあればそれと Parallel.Invoke を利用するのがよさそうです。例えば同期バージョンのメソッドに GetRows(), GetRows() というのがあるとすると、以下のような感じ。
19
+ 質問者さんのコードの InputData.GetRowsAsync(), Master.GetRowsAsync() に同期バージョンがあればそれと Parallel.Invoke を利用するのがよさそうです。例えば同期バージョンのメソッドに InputData.GetRows(), Master.GetRows() というのがあるとすると、以下のような感じ。
20
20
 
21
21
 
22
22
 
@@ -36,11 +36,11 @@
36
36
 
37
37
 
38
38
 
39
- 非同期版 GetRowsAsync(), GetRowsAsync() を使って「試したこと」のコードのようにすると、非同期版メソッドの中で await を使っているでしょうから、それと Task.Result がお互い待機しあってデッドロックに陥るかもしれません。(コンソールアプリは仕組みが違っていてデッドロックにならないので注意)
40
-
41
-
42
-
43
- (非同期版メソッド GetRowsAsync(), GetRowsAsync() に同期バージョンがあれば、それを使えば「試したこと」のコードのように WhenAll を使ったコードでもデッドロックの問題は無いと思います。下のサンプルコードの button5_Click メソッドを見てください。ただし、マルチコアが利用されるかどうかが分かりません。サンプルを作って動かしてみるとそんな感じがしますが、確信が持てないです)
39
+ 非同期版 InputData.GetRowsAsync(), Master.GetRowsAsync() を使って「試したこと」のコードのようにすると、非同期版メソッドの中で await を使っているでしょうから、それと Task.Result がお互い待機しあってデッドロックに陥るかもしれません。(コンソールアプリは仕組みが違っていてデッドロックにならないので注意)
40
+
41
+
42
+
43
+ (非同期版メソッド InputData.GetRowsAsync(), Master.GetRowsAsync() に同期バージョンがあれば、それを使えば「試したこと」のコードのように WhenAll を使ったコードでもデッドロックの問題は無いと思います。下のサンプルコードの button5_Click メソッドを見てください。ただし、マルチコアが利用されるかどうかが分かりません。サンプルを作って動かしてみるとそんな感じがしますが、確信が持てないです)
44
44
 
45
45
 
46
46
 

2

追記&訂正

2020/12/26 23:33

投稿

退会済みユーザー
test CHANGED
@@ -44,7 +44,7 @@
44
44
 
45
45
 
46
46
 
47
- ただ、そもそもの話として、相手が DB で Linq to Entities で処理するなら、Linq 式で JOIN した SELECT クエリを生成させて、それを一本だけ DB に投げて目的のデータを取得できるのではないですか? であれば、クエリを 2 つに分けて DB に 2 回クエリを投げるより、その方が早いのではないですか?
47
+ **ただ、そもそもの話として、相手が DB で Linq to Entities で処理するなら、Linq 式で JOIN した SELECT クエリを生成させて、それを一本だけ DB に投げて目的のデータを取得できるのではないですか? であれば、クエリを 2 つに分けて DB に 2 回クエリを投げるより、その方が早いのではないですか?**
48
48
 
49
49
 
50
50
 

1

追記

2020/12/26 23:26

投稿

退会済みユーザー
test CHANGED
@@ -40,7 +40,7 @@
40
40
 
41
41
 
42
42
 
43
- (非同期版メソッド GetRowsAsync(), GetRowsAsync() に同期バージョンがあれば、それを使えば「試したこと」のコードのように WhenAll を使ったコードでもデッドロックの問題は無いと思います。ただし、マルチコアが利用されるかどうかが分かりません。サンプルを作って動かしてみるとそんな感じがしますが、確信が持てないです)
43
+ (非同期版メソッド GetRowsAsync(), GetRowsAsync() に同期バージョンがあれば、それを使えば「試したこと」のコードのように WhenAll を使ったコードでもデッドロックの問題は無いと思います。下のサンプルコードの button5_Click メソッドを見てください。ただし、マルチコアが利用されるかどうかが分かりません。サンプルを作って動かしてみるとそんな感じがしますが、確信が持てないです)
44
44
 
45
45
 
46
46