MEFアプリケーションを開発中です。私はパブリッシャーとしてプラグインを、サブスクライバーとして別のプラグインを使用しています。現在の問題では、両方のプラグインインスタンスがアクティブであることを保証します。加入者に私はイベントをサブスクライブし、出版社に私は、呼び出しリストを反復処理するとなるように非同期イベントを発生させるためにBeginInvokeメソッドを呼び出します。EventHandlerが呼び出されていないにもかかわらず、サブスクライブするメソッドを含むInvocationList C#
出版社:
public class BackchannelEventArgs : EventArgs {
public string Intensity { get; }
public BackchannelEventArgs(string intensity) {
this.Intensity = intensity;
}
}
public class Publisher {
public event EventHandler<BackchannelEventArgs> BackchannelEvent = delegate { };
private void BackchannelEventAux(string bcintensity) {
Plugin.LogDebug("BACKCHANNEL EVENT, sending to " + BackchannelEvent.GetInvocationList().Length + " subscribers: " + bcintensity);
var args = new BackchannelEventArgs(bcintensity);
foreach (EventHandler<BackchannelEventArgs> receiver in BackchannelEvent.GetInvocationList()) {
receiver.BeginInvoke(this, args, null, null);
}
}
}
加入者(関連するスニペット、初期化pluginsManagerによって呼び出さされている中で、私は)ログを見ることができます:
class Subscriber {
public void Init(){
LogInfo("Before subscribing");
publisher.BackchannelEvent += HandleBackchannelEvent;
LogInfo("After subscribing");
}
private void HandleBackchannelEvent(object sender, BackchannelEventArgs e) {
LogDebug("Handle Backchannel!");
}
}
を今、あなたはイベントハンドラで見るログインは全く呼び出されません。私は同じ構造に従う他の4つのイベントがあり、特にこのイベントは呼び出されていません(私は他のイベントのログを見ることができます)。他のプラグインはまったく同じ構造に従います。
はすでに試してみました:同期
- コール
BackchannelEvent(this, args)
が、結果は同じです。 - 他のプラグインでも同じイベントを購読しますが、問題はこの単一のイベントに残ります(同じ構造に従う他のメンバーには残りません)。
私はあなたに私にこれについていくつかの助けを与えることを望みます。
ありがとうございました
編集:示されたコードはスニペットです。 Initメソッドは、pluginsManagerによって呼び出されています。私は購読する前にログを記録して、私が実際に購読していることを確認することができます。
Edit2:InvocationListの要素数は実際には2(空のデリゲートとサブスクライバ)であり、チェックアウトされます。
'Init'が、それは(と呼ばれるが、設定されたブレークポイントまたは追加されていますかどうか確認する(コードによって証明されていないです、あなたの声明にもかかわらず)、コンストラクタではないので、*と呼ばれるように*保証はないの' LogDebugありがとう(「何か」)を入れる)。 – Sinatr
私は理解しています。私が示したのは、コードスニペットです。 Init()を呼び出すプラグインマネージャがあります。これを投稿に追加します。私は自分のコンソールに表示されているinitのログを持っています。 –
さらに、invocationListには、空のデリゲートとサブスクライバの2つの要素が含まれています。私はブレークポイントを入れて、私はBeginInvokeが呼び出されていることを確認することができます。 –