SignalR集线器中的事件处理程序

时间:2015-03-25 15:30:51

标签: c# signalr autofac

我面临以下问题。我有一个像这样的SignalR中心:

public class NewsLetterHub : Hub
{
    private readonly IServicesContainer _servicesContainer;
    private readonly ILifetimeScope _hubLifetimeScope;

    public NewsLetterHub(ILifetimeScope lifetimeScope, IServicesContainer servicesContainer)
    {
        _servicesContainer = servicesContainer;
        _hubLifetimeScope = lifetimeScope.BeginLifetimeScope();

        _servicesContainer.NewsLetterService.ImportProgress += _sentNewsLetter_Progress;
    }

我以这种方式在Autofac中注册此中心:

builder.RegisterHubs(Assembly.GetExecutingAssembly());

调试代码我看到每个请求调用一次hub构造函数,但ImportProgress事件包含先前注册的处理程序。这使得_sentNewsLetter_Progress方法可以多次执行。

我试图以这种方式注册集线器:

builder.RegisterHubs(Assembly.GetExecutingAssembly()).InstancePerLifetimeScope();

这样做似乎有效,但我不知道这是否是正确的解决方案(它会变成单身人士)。

我也试图取消注册该事件:

_servicesContainer.NewsLetterService.ImportProgress -= _sentNewsLetter_Progress;
_servicesContainer.NewsLetterService.ImportProgress += _sentNewsLetter_Progress; 

但似乎什么也没做。

如何防止这种行为?

1 个答案:

答案 0 :(得分:0)

您需要更改取消注册事件处理程序的位置,以便在析构函数或Dispose()方法中执行此操作。如果您尝试在构造函数中执行,它将尝试从正在构造的实例中取消注册_sentNewsLetter_Progress处理程序。由于该实例尚未注册,它将无能为力。但是,如果您在析构函数/ Dispose中取消注册,那么它将起作用。