C# 信号集线器中的事件处理程序

C# 信号集线器中的事件处理程序,c#,signalr,autofac,C#,Signalr,Autofac,我面临以下问题。我有一个这样的信号中心: public class NewsLetterHub : Hub { private readonly IServicesContainer _servicesContainer; private readonly ILifetimeScope _hubLifetimeScope; public NewsLetterHub(ILifetimeScope lifetimeScope, IServicesContainer serv

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

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());
builder.RegisterHubs(Assembly.GetExecutingAssembly()).InstancePerLifetimeScope();
调试代码我看到每个请求调用一次集线器构造函数,但是
ImportProgress
事件包含以前注册的处理程序。这使得
\u sent newsletter\u Progress
方法可以多次执行

我尝试通过以下方式注册中心:

builder.RegisterHubs(Assembly.GetExecutingAssembly());
builder.RegisterHubs(Assembly.GetExecutingAssembly()).InstancePerLifetimeScope();
这样做似乎有效,但我不知道这是否是正确的解决方案(它变成了单例)

我还尝试注销该事件:

_servicesContainer.NewsLetterService.ImportProgress -= _sentNewsLetter_Progress;
_servicesContainer.NewsLetterService.ImportProgress += _sentNewsLetter_Progress; 
但它似乎什么也没做


如何防止这种行为?

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

再加上这个,我不确定这是否是您正在寻找的设计。您是否试图在触发进度事件时向所有连接的客户端发布消息?如果是这样,您需要在某个地方的单例中注册一个事件处理程序(可能是中心的静态构造函数),并调用类似于
GlobalHost.ConnectionManager.GetHubContext().Clients.All.progress()
的函数。有关示例,请参见。