質問編集履歴

1

質問を追記しました。

2015/12/07 12:25

投稿

nobysanz
nobysanz

スコア42

test CHANGED
File without changes
test CHANGED
@@ -8,60 +8,98 @@
8
8
 
9
9
  ご教授お願いします。
10
10
 
11
+ ```
12
+
13
+ Thread Run St:06:59:37.0947348(スレッドA開始)
14
+
15
+ Thread Run St:06:59:37.0947348(スレッドB開始)
16
+
17
+ Thread Run --:06:59:37.1103348(スレッドA①フォーム作成完了 new Form)
18
+
19
+ Thread Run --:06:59:37.1103348(スレッドA②処理)
20
+
21
+ Thread Run --:06:59:37.1103348(スレッドA②処理)
22
+
23
+ Thread Run --:06:59:37.1103348(スレッドA②処理)
24
+
25
+ Thread Run --:06:59:37.1103348(スレッドA②処理)
26
+
27
+ Thread Run --:06:59:37.1103348(スレッドA③フォーム表示 Application.Run)
28
+
29
+ Thread Run --:06:59:37.1259348(スレッドB①フォーム作成完了 new Form)
30
+
31
+ Thread Run --:06:59:37.1259348(スレッドB②処理)
32
+
33
+ Thread Run --:06:59:37.1259348(スレッドB②処理)
34
+
35
+ Thread Run --:06:59:37.1259348(スレッドB②処理)
36
+
37
+ Thread Run --:06:59:37.1259348(スレッドB②処理)
38
+
39
+ Thread Run --:06:59:37.1259348(スレッドB③フォーム表示 Application.Run)
40
+
41
+ ```
11
42
 
12
43
 
13
44
 
45
+ 2015-12-07 追記です(コメントありがとうございます!)
14
46
 
15
- Thread Run St:06:59:37.0947348(スレッドA開始)
47
+ このようなことをしているのは、本質問の発端となった事象を再現させたく。
48
+
49
+ 検証しておりました。https://teratail.com/questions/21087
50
+
51
+ 私の認識と、再現させるには以下と考えますがいかがでしょうか?
16
52
 
17
53
 
18
54
 
19
- Thread Run St:06:59:37.0947348(スレッドB開始)
55
+ 1 コメントの内容にて以下のような認識を持ちました。
20
56
 
21
57
 
22
58
 
59
+ (1)Formの生成は、リソースがロックされる。
60
+
23
- Thread Run --:06:59:37.1103348(スレッドA①フォーム作成完了 new Form
61
+ 同じタイミングで実行した2つのスレッドA,B内でFormを生成すると、
62
+
63
+ スレッドAのForm生成後に、スレッドBのForm生成が実行される。
24
64
 
25
65
 
26
66
 
67
+ (2)オブジェクトのnewは内部的に排他制御がかかる。
68
+
27
- Thread Run --:06:59:37.1103348(スレッドA処理
69
+ スレッドAでnew処理を実行した場合、newが完了するまで、スレッドBが待機される。
28
70
 
29
71
 
30
72
 
73
+ (3)タスクスイッチが頻繁発生しない
74
+
75
+ タスクスイッチは、オーバーヘッドがかかる処理のため、
76
+
31
- Thread Run --:06:59:37.1103348(ドA②処理)
77
+ 100msの処理時間ではタクスイチしない。
32
78
 
33
79
 
34
80
 
35
- Thread Run --:06:59:37.1103348(スレッドA②処理)
81
+ (4)スレッドプールで同じキューに入った場合は、スレッド完了までまたされる。
36
82
 
37
83
 
38
84
 
39
- Thread Run --:06:59:37.1103348(スレッドA②処理
85
+ (5)マルチコアで特に排他制御をすることもなく同時に開始した処理が、
86
+
87
+ 15ミリ秒以上待たされるということは考えにくい。
40
88
 
41
89
 
42
90
 
43
- Thread Run --:06:59:37.1103348(スレッドAフォーム表示 Application.Run)
91
+ 2 スレッドAフォーム作成完了後の処理中に、スレッドBのフォーム作成を実行させるには?
92
+
93
+ (1) Sleep()をいれる → だめでした。
94
+
95
+ (2) Thread.Yield()をいれる → だめでした。
96
+
97
+ (3) ファイルアクセス処理をする → 検証中
44
98
 
45
99
 
46
100
 
47
- Thread Run --:06:59:37.1259348(スレッドB①フォーム作成完了 new Form)
101
+ ほかになにか考えられますでしょうか?
48
102
 
49
103
 
50
104
 
51
- Thread Run --:06:59:37.1259348(スレッドB②処理)
105
+ ご教授お願いいたします。
52
-
53
-
54
-
55
- Thread Run --:06:59:37.1259348(スレッドB②処理)
56
-
57
-
58
-
59
- Thread Run --:06:59:37.1259348(スレッドB②処理)
60
-
61
-
62
-
63
- Thread Run --:06:59:37.1259348(スレッドB②処理)
64
-
65
-
66
-
67
- Thread Run --:06:59:37.1259348(スレッドB③フォーム表示 Application.Run)