事件处理程序没有被调用,尽管含订阅方法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(空委托和用户),所以它检查出来。
答
好。我不知道为什么,但我找到了解决方案,以便其他遇到问题的人可以找到解决方案。它与我为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是它正在工作的版本。日志保证出现。我不知道为什么它不让我使用扩展,但现在解决了。它将使意义,如果随机扩展抛出一个异常,但事实并非如此......
如果任何其他人绊倒我希望这可以帮助你找出问题比我快的问题
谢谢
'Init'不是构造函数,所以它不是*保证*被称为(尽管你的说法,它不是由代码证明),检查它被称为什么(设置断点出现或添加'LogDebug (“某物”)进入)。 – Sinatr
我明白了。我所展示的是一小段代码。我有一个负责调用Init()的pluginsManager。我会将其添加到帖子中。我在控制台上显示的init中有一个日志。 –
此外,invocationList包含2个元素:预期的空委托和订户。我已经把一个断点,我可以确认正在调用BeginInvoke。 –