質問編集履歴

4

サンプルを記載

2015/04/16 01:54

投稿

Ryzna
Ryzna

スコア85

test CHANGED
File without changes
test CHANGED
@@ -73,3 +73,149 @@
73
73
  の3つの点でtorakichiさんの案をベストアンサーとさせていただきました。
74
74
 
75
75
  もっといい方法があるよ!というご提案は引き続き募集させていただきますのでぜひご投稿いただければと思います。
76
+
77
+
78
+
79
+ 追記3:
80
+
81
+ 以下サンプルです。
82
+
83
+ ```lang-<C#>
84
+
85
+ // 既存のクラス
86
+
87
+ // 既にリリース済み別案件で使用中なので出来れば手を入れたくない。入れちゃダメというわけでもない
88
+
89
+ public class ClassA
90
+
91
+ {
92
+
93
+ public event EventHandler EventE;
94
+
95
+
96
+
97
+ public void MethodM()
98
+
99
+ {
100
+
101
+ var e = new EventArgs();
102
+
103
+
104
+
105
+ // MethodM内のいろいろ処理
106
+
107
+
108
+
109
+ OnEventE(e);
110
+
111
+ }
112
+
113
+
114
+
115
+ protected virtual OnEventE(EventArgs e)
116
+
117
+ {
118
+
119
+ // OnEventE内のいろいろ処理
120
+
121
+
122
+
123
+ if (EventE != null)
124
+
125
+ EventE(this, e);
126
+
127
+ }
128
+
129
+ }
130
+
131
+
132
+
133
+ // ものすごく簡略化した新規コード
134
+
135
+ public class Hoge
136
+
137
+ {
138
+
139
+ private ClassA _instance1;
140
+
141
+ private ClassA _instance2;
142
+
143
+
144
+
145
+ public Hoge()
146
+
147
+ {
148
+
149
+ _instance1 = new ClassA();
150
+
151
+ _instance2 = new ClassA();
152
+
153
+ }
154
+
155
+
156
+
157
+ private void Instance1_EventE(object obj, EventArgs e)
158
+
159
+ {
160
+
161
+ // インスタンス1.EventE発生時のいろいろ処理
162
+
163
+
164
+
165
+ _instance2.MethodM(); // ここでは_isntance2.EventEが発生してほしくない
166
+
167
+ }
168
+
169
+
170
+
171
+ private void Instance2_EventE(object obj, EventArgs e)
172
+
173
+ {
174
+
175
+ // インスタンス2.EventE発生時のいろいろ処理
176
+
177
+
178
+
179
+ _instance1.MethodM(); // ここでは_isntance1.EventEが発生してほしくない
180
+
181
+ }
182
+
183
+
184
+
185
+ public void MethodA()
186
+
187
+ {
188
+
189
+ // Hoge.MethodAとしていろいろ処理
190
+
191
+
192
+
193
+ _instance1.MethodM(); // ここでは_isntance1.EventEが発生してほしい
194
+
195
+ }
196
+
197
+
198
+
199
+ public void MethodB()
200
+
201
+ {
202
+
203
+ // Hoge.MethodBとしていろいろ処理
204
+
205
+
206
+
207
+ _instance2.MethodM(); // ここでは_isntance2.EventEが発生してほしい
208
+
209
+ }
210
+
211
+ }
212
+
213
+
214
+
215
+ ```
216
+
217
+
218
+
219
+ この状態のままMethodA,Bのどちらかを実行したら、当然相互にイベントが発生し続けてしまうわけで、それは困るということです。
220
+
221
+ 現状はこのInstance1_EventE,Instance2_EventEの中でReaderWriterLock(実コードにてそういうロックが必要なのでそのまま流用しています。)のWriterでロックを掛けておいて、さらにその中でイベントハンドラの解除・追加を行うようにしていますが、それ以外に良い方法は無いかなぁと模索している状況です。

3

ベストアンサー決定について

2015/04/16 01:54

投稿

Ryzna
Ryzna

スコア85

test CHANGED
File without changes
test CHANGED
@@ -57,3 +57,19 @@
57
57
  4/15 19:30 頃までにご提案頂いた方法の中からベストアンサーを決定させていただきます。
58
58
 
59
59
  それ以降も継続してご意見ご提案の募集は継続させて頂きます。よろしくお願いします。
60
+
61
+
62
+
63
+ 追記2:
64
+
65
+ 4/15 20:00の時点でご提案いただいていた3つの方法のうち、
66
+
67
+ ・既存コードに手を加えない
68
+
69
+ ・一連のフローの中で切り替えが行える
70
+
71
+ ・クラスAと異なる構造でも適用できる
72
+
73
+ の3つの点でtorakichiさんの案をベストアンサーとさせていただきました。
74
+
75
+ もっといい方法があるよ!というご提案は引き続き募集させていただきますのでぜひご投稿いただければと思います。

2

ベストアンサー決定期限を設定しました。

2015/04/15 11:18

投稿

Ryzna
Ryzna

スコア85

test CHANGED
File without changes
test CHANGED
@@ -49,3 +49,11 @@
49
49
  よろしくお願いします。
50
50
 
51
51
  以上
52
+
53
+
54
+
55
+ 追記:
56
+
57
+ 4/15 19:30 頃までにご提案頂いた方法の中からベストアンサーを決定させていただきます。
58
+
59
+ それ以降も継続してご意見ご提案の募集は継続させて頂きます。よろしくお願いします。

1

誤:イベント発生させないフラグ → 正:「イベントを処理しない」フラグ

2015/04/15 01:40

投稿

Ryzna
Ryzna

スコア85

test CHANGED
File without changes
test CHANGED
@@ -36,7 +36,7 @@
36
36
 
37
37
  補足と現状での考え:
38
38
 
39
- このプログラムはマルチスレッドで実行されており、当然別クラスからも呼ばれることも想定しておりますので、とりあえずロック内でイベントハンドラを一時的に回避するorイベント発生させないフラグによる判定は思いついているのですがこれでいいのかなぁと自信がない次第です。
39
+ このプログラムはマルチスレッドで実行されており、当然別クラスからも呼ばれることも想定しておりますので、とりあえずロック内でイベントハンドラを一時的に回避するorイベントを処理しないフラグによる判定は思いついているのですがこれでいいのかなぁと自信がない次第です。
40
40
 
41
41
 
42
42