尽管 InvocationList 包含订阅方法 C#,但未调用事件处理程序
本文关键字:调用 事件处理 程序 InvocationList 包含订 方法 尽管 | 更新日期: 2023-09-27 17:55:23
我正在开发一个MEF应用程序。我使用一个插件作为发布者,另一个作为订阅者。对于当前的问题,我保证两个插件实例都处于活动状态。在订阅服务器上,我订阅了事件,在发布服务器上,我迭代调用列表并调用 BeginInvoke 以异步引发事件,如下所示:
发行人:
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);
}
}
}
订阅者(相关代码段,Init 由插件管理器调用,我可以看到日志):
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 方法由插件管理器调用。我已经在订阅电话之前放置了一个日志,我可以确认我确实在订阅。
Edit2:调用列表中的元素数实际上是 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 是它正在工作的版本。保证显示日志。我不知道为什么它不让我使用扩展,但现在解决了。如果随机扩展引发异常是有道理的,但事实并非如此......
如果任何其他人偶然发现了这个问题,我希望这可以帮助您比我更快地解决问题。
谢谢
编辑:错别字