事件处理程序没有被调用,尽管含订阅方法C#

问题描述:

我开发一个应用程序MEF InvocationList。我使用插件作为发布者,另一个作为订阅者。对于目前的问题,我保证这两个插件实例都处于活动状态。在用户我订阅事件,并在发布我遍历调用列表,并调用BeginInvoke的异步引发事件像这样:事件处理程序没有被调用,尽管含订阅方法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()的pluginsManager。我会将其添加到帖子中。我在控制台上显示的init中有一个日志。 –

+0

此外,invocationList包含2个元素:预期的空委托和订户。我已经把一个断点,我可以确认正在调用BeginInvoke。 –

好。我不知道为什么,但我找到了解决方案,以便其他遇到问题的人可以找到解决方案。它与我为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是它正在工作的版本。日志保证出现。我不知道为什么它不让我使用扩展,但现在解决了。它将使意义,如果随机扩展抛出一个异常,但事实并非如此......

如果任何其他人绊倒我希望这可以帮助你找出问题比我快的问题

谢谢