2016-07-05 7 views
-1

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(空のデリゲートとサブスクライバ)であり、チェックアウトされます。

+0

'Init'が、それは(と呼ばれるが、設定されたブレークポイントまたは追加されていますかどうか確認する(コードによって証明されていないです、あなたの声明にもかかわらず)、コンストラクタではないので、*と呼ばれるように*保証はないの' LogDebugありがとう(「何か」)を入れる)。 – Sinatr

+0

私は理解しています。私が示したのは、コードスニペットです。 Init()を呼び出すプラグインマネージャがあります。これを投稿に追加します。私は自分のコンソールに表示されているinitのログを持っています。 –

+0

さらに、invocationListには、空のデリゲートとサブスクライバの2つの要素が含まれています。私はブレークポイントを入れて、私はBeginInvokeが呼び出されていることを確認することができます。 –

答えて

0

大丈夫です。私はなぜその理由がわからないのですが、解決策を見つけ出して、問題を抱えている他の人たちが解決策を見つけることができるようにしました。それはRandomクラス(私は実際に説明することはできませんが、それはC#のバグかもしれませんが例外をスローしていなかった)のために作成した拡張と関連していました。ランダム拡張は私が作成した外部NuGetパッケージによって提供されます。

(ランダム拡張を使用しない)バージョンA:イベントハンドラの

本体:(ランダム拡張を使用して)

LogDebug("Inside Handler"); 
double intensityValue2 = GetRandomNumber(Settings.MinimumIntensity, Settings.MaximumIntensity); 
double frequency2 = GetRandomNumber(Settings.MinimumFrequency, Settings.MaximumFrequency); 
int repetitions2 = GetRandomInt(Settings.MinimuMRepetitions, Settings.MaximumRepetitions); 

バージョンB:イベントハンドラの

ボディ:

LogDebug("Inside Handler"); 
double intensityValue2 = random.GetRandomNumber(Settings.MinimumIntensity, Settings.MaximumIntensity); 
double frequency2 = random.GetRandomNumber(Settings.MinimumFrequency, Settings.MaximumFrequency); 
int repetitions2 = random.GetRandomNumber(Settings.MinimuMRepetitions, Settings.MaximumRepetitions); 

バージョンAは動作しています。ログは必ず表示されます。なぜ私は拡張機能を使用させないのか分かりませんが、今は解決されています。ランダム拡張が例外をスローした場合は意味がありますが、そうではありません。

他の人が問題に直面した場合、私はこの問題がIより速く解消されるのを助けてくれることを願っています。

関連する問題