私には、ValueGeneratedという名前のイベントがあります。 ValueGeneratedを生成し、発生させるコードはスレッド内で実行されており、このイベントを受け取るメソッドはform.control(つまりフォーム)上にあります。 UIスレッドが別のスレッドがUIを変更することはできませんので、私は、イベントの生成に以下のコードを書いた:イベントのターゲットを取得する方法
if (ValueGenerated.Target is System.windows.form.control)
{
Control targetForm = ValueGenerated.Target as control;
targetForm.Invoke(ValueChanged,new object[]{this,args});
}
しかし、私は、イベントが複数のMethodeのことで登録されている場合はどうなるかと思います。たとえば、2つまたは3つの宛先によって。なぜ、イベントとデリゲートクラスには、最後のメソッドのインスタンスオブジェクトを返すTargetプロパティが追加されていますか?私たちは常に最後のものだけを必要としますか?
GetInvocationListを使用して、登録されたすべての代理人を取得します。それから、ターゲットを確認するためにそれらをすべて検査することができます。 –
他のスレッドからUIを更新できないという人は誰ですか? – Jim
イベントの実際のバッキングストアはMulticastDelegateです。複数の加入者を許可することによって、代議員を拡張します。潜在的なスレッドのバグを隠すことは非常に悪い考えです。特にInvoke()はデッドロックの原因となるので、イベントハンドラメソッドには戻り値がないため、デッドロックは必要ありません。特にUIに影響を及ぼすイベントは、ワーカースレッドが動作し続けているのにユーザがウィンドウを閉じたときに間違ってしまうことがよくあります。それをしないでください。 –