我面临以下问题。我有一个像这样的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;
但似乎什么也没做。
如何防止这种行为?
答案 0 :(得分:0)
您需要更改取消注册事件处理程序的位置,以便在析构函数或Dispose()方法中执行此操作。如果您尝试在构造函数中执行,它将尝试从正在构造的实例中取消注册_sentNewsLetter_Progress处理程序。由于该实例尚未注册,它将无能为力。但是,如果您在析构函数/ Dispose中取消注册,那么它将起作用。