尽管 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(空委托和订阅者),因此它会签出。

尽管 InvocationList 包含订阅方法 C#,但未调用事件处理程序

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

如果任何其他人偶然发现了这个问题,我希望这可以帮助您比我更快地解决问题。

谢谢

编辑:错别字