gpt4 book ai didi

c# - Autofac 无法处理后台任务

转载 作者:太空宇宙 更新时间:2023-11-03 19:55:52 29 4
gpt4 key购买 nike

我有一个任务需要在后台的单独线程中运行,我正在使用 SignalR 报告进度。这在一段时间前有效,我对代码进行了一些修改,但对于现在收到的错误,我完全不知所措:

“从请求实例的范围内看不到带有与“AutofacWebRequest”匹配的标签的范围。这通常表示注册为每个 HTTP 请求的组件正在被 SingleInstance() 组件(或类似的组件)请求场景。)在 Web 集成下,始终从 DependencyResolver.Current 或 ILifetimeScopeProvider.RequestLifetime 请求依赖项,而不是从容器本身请求依赖项。”

非常感谢任何帮助!

    public ActionResult DoAction(IEnumerable<string> items){

//...
Func<CancellationToken, Task> taskFunc = CancellationToken => performAction(items);
HostingEnvironment.QueueBackgroundWorkItem(taskFunc);
//...
}

private async Task performAction(IEnumerable<string> items){
var svc = AutofacDependencyResolver.Current.AppicationContainer.BeginLifetimeScope().Resolve<MyService>();
svc.Method(items);
}

public class MyService{
private EntityContext db;

public MyService(EntityContext db){

this.db = db;
}
}

在我的 Startup.Container.cs 文件中:

builder.RegisterType<MyService>().As<MyService>().InstancePerLifetimeScope();
builder.RegisterType<EntityContext>().InstancePerRequest();

最佳答案

我最近使用这个 answer 的帮助实现了类似的东西还有这个answer .您需要创建一个新的生命周期范围 - 这听起来像是在 Web 应用程序中执行此操作,因此您需要通过 per-request 标记创建范围(如下例)。

另一个(非 StackOverflow)answer提供了类似的建议。

public Task Run<T>(Action<T> action)
{
Task.Factory.StartNew(() =>
{
using (var lifetimeScope = _container.BeginLifetimeScope(MatchingScopeLifetimeTags.RequestLifetimeScopeTag))
{
var service = lifetimeScope.Resolve<T>();
action(service);
}
});
return Task.FromResult(0);
}

关于c# - Autofac 无法处理后台任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33658012/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com