このタイプの例外の原因となっている正確なコレクションが実際には特定されていないことがよくあります。それは本当ですか、それとも明白なはずですか?おそらく、例外メッセージを正しく解釈する方法がわかりません。
具体的にはこれについて疑問に思います。それが参照するコレクションは何ですか?
イベントデリゲートのパラメーターは単純に(オブジェクト送信者)であり、発生したイベントはnullパラメーターを渡します。イベントを発生させるクラス自体はリストを継承しますが、次のようになります。
public class TimeSerie : List<BarData>
ここで、「コレクション」がイベントを発生させるオブジェクトを指しているのか、それとも別のオブジェクトであるのかは明らかですか?たとえば、動的に変更されているメソッドのイベントハンドラーのコレクションである可能性がありますか?それとも、別の例外が発生しますか?
************** Exception Text **************
System.InvalidOperationException:
Collection was modified; enumeration operation may not execute.
at System.Windows.Forms.Control.MarshaledInvoke(Control caller, Delegate method, Object[] args, Boolean synchronous)
at System.Windows.Forms.Control.Invoke(Delegate method, Object[] args)
at System.Windows.Forms.Control.Invoke(Delegate method)
at SomeNameSpace.SomeUserControl.InvokeOnUpdateHistory(Object sender) in D:\SomePath\SomeUserControl.cs:line 5179
at OtherNameSpace.OtherClass.TimeSerie.HistoryUpdateEventHandler.Invoke(Object sender)
UserControlで例外が発生します:
public class SomeUserControl
private void InvokeOnUpdate(object sender)
{
this.Invoke(new GenericInvoker(Method)); // << Exception here!
}
private void Method() {...}
編集: いくつかのコードを追加しました。少し単純化されていますが、関連するビットが含まれていると思います。
private void Method()
{
if (this.instrument == null) return;
UnRegisterTimeSerieHandlers(this.ts);
this.ts = instrument.DataSeries.GetTimeSerieByInterval(interval);
if (ts != null)
{
RegisterTimeseriesHandlers(ts);
ClearAndLoadAllHistory();
}
}
private void UnRegisterTimeSerieHandlers(TimeSerie ts)
{
if (ts != null)
{
ts.TickUpdate -= InvokeUpdateCurrentBar;
ts.NewBarUpdate -= InvokeUpdateNewBar;
ts.HistoryUpdate -= InvokeOnUpdateHistory;
this.ts = null;
}
}
private void RegisterTimeseriesHandlers(TimeSerie ts)
{
ts.TickUpdate += InvokeUpdateCurrentBar;
ts.NewBarUpdate += InvokeUpdateNewBar;
ts.HistoryUpdate += InvokeOnUpdateHistory;
}