質問編集履歴
1
質問を追記しました。
title
CHANGED
File without changes
|
body
CHANGED
@@ -3,32 +3,51 @@
|
|
3
3
|
2つのスレッドをスレッドプールから順番に起動し、処理時間をログファイルに出力しました。
|
4
4
|
結果を見ると、起動時間は同じなのに、必ずform生成後に、2番目のスレッドのform生成が完了しております。2つのスレッド間で、排他制御などされているのでしょうか?たとえば、form作成時はリソースの排他がかかるとか? スレッドAの処理の間に、スレッドBの処理がはいると考えておりました。
|
5
5
|
ご教授お願いします。
|
6
|
-
|
6
|
+
```
|
7
|
-
|
8
7
|
Thread Run St:06:59:37.0947348(スレッドA開始)
|
9
|
-
|
10
8
|
Thread Run St:06:59:37.0947348(スレッドB開始)
|
11
|
-
|
12
9
|
Thread Run --:06:59:37.1103348(スレッドA①フォーム作成完了 new Form)
|
13
|
-
|
14
10
|
Thread Run --:06:59:37.1103348(スレッドA②処理)
|
15
|
-
|
16
11
|
Thread Run --:06:59:37.1103348(スレッドA②処理)
|
17
|
-
|
18
12
|
Thread Run --:06:59:37.1103348(スレッドA②処理)
|
19
|
-
|
20
13
|
Thread Run --:06:59:37.1103348(スレッドA②処理)
|
21
|
-
|
22
14
|
Thread Run --:06:59:37.1103348(スレッドA③フォーム表示 Application.Run)
|
23
|
-
|
24
15
|
Thread Run --:06:59:37.1259348(スレッドB①フォーム作成完了 new Form)
|
25
|
-
|
26
16
|
Thread Run --:06:59:37.1259348(スレッドB②処理)
|
27
|
-
|
28
17
|
Thread Run --:06:59:37.1259348(スレッドB②処理)
|
29
|
-
|
30
18
|
Thread Run --:06:59:37.1259348(スレッドB②処理)
|
31
|
-
|
32
19
|
Thread Run --:06:59:37.1259348(スレッドB②処理)
|
20
|
+
Thread Run --:06:59:37.1259348(スレッドB③フォーム表示 Application.Run)
|
21
|
+
```
|
33
22
|
|
23
|
+
2015-12-07 追記です(コメントありがとうございます!)
|
24
|
+
このようなことをしているのは、本質問の発端となった事象を再現させたく。
|
25
|
+
検証しておりました。https://teratail.com/questions/21087
|
26
|
+
私の認識と、再現させるには以下と考えますがいかがでしょうか?
|
27
|
+
|
28
|
+
1 コメントの内容にて以下のような認識を持ちました。
|
29
|
+
|
30
|
+
(1)Formの生成は、リソースがロックされる。
|
31
|
+
同じタイミングで実行した2つのスレッドA,B内でFormを生成すると、
|
32
|
+
スレッドAのForm生成後に、スレッドBのForm生成が実行される。
|
33
|
+
|
34
|
+
(2)オブジェクトのnewは内部的に排他制御がかかる。
|
35
|
+
スレッドAでnew処理を実行した場合、newが完了するまで、スレッドBが待機される。
|
36
|
+
|
37
|
+
(3)タスクスイッチが頻繁発生しない
|
38
|
+
タスクスイッチは、オーバーヘッドがかかる処理のため、
|
39
|
+
数100msの処理時間ではタスクスイッチしない。
|
40
|
+
|
41
|
+
(4)スレッドプールで同じキューに入った場合は、スレッド完了までまたされる。
|
42
|
+
|
43
|
+
(5)マルチコアで特に排他制御をすることもなく同時に開始した処理が、
|
44
|
+
15ミリ秒以上待たされるということは考えにくい。
|
45
|
+
|
34
|
-
|
46
|
+
2 スレッドAのフォーム作成完了後の処理中に、スレッドBのフォーム作成を実行させるには?
|
47
|
+
(1) Sleep()をいれる → だめでした。
|
48
|
+
(2) Thread.Yield()をいれる → だめでした。
|
49
|
+
(3) ファイルアクセス処理をする → 検証中
|
50
|
+
|
51
|
+
ほかになにか考えられますでしょうか?
|
52
|
+
|
53
|
+
ご教授お願いいたします。
|