gpt4 book ai didi

c# - 在单独的线程中使用实例时使用什么生命周期范围?

转载 作者:行者123 更新时间:2023-11-30 18:13:01 25 4
gpt4 key购买 nike

我有一个 WebApi 项目,在 Controller 中我使用 HostingEnvironment.QueueBackgroundWorkItem 在单独的线程中启 Action 业:

public IHttpActionResult DoJob()
{
HostingEnvironment.QueueBackgroundWorkItem(ct =>
{
var service = new MyService(logService, userInfo);
var entity = service.DoJob(ct);
});

return Ok();
}

目前,在上面我正在使用我的服务的一个具体实例(我想替换它)。我还使用 Autofac 并且对于我的服务,我配置如下:

builder.RegisterAssemblyTypes(assemblies)
.Where(t => t.Name.EndsWith("Service"))
.AsImplementedInterfaces()
.InstancePerRequest();

在请求中正常使用时,上述注册适用于所有服务。

当请求终止后在单独的线程中运行时,上述注册是否也适用于服务?

最佳答案

Will the above registration also work for services when run in a separate thread after the request terminates?

是的,注册配置将起作用。

您在服务中调用的任何方法都可能有效,也可能无效:

What this means is that if you try to resolve components that are registered as instance-per-request but there’s no current request… you’re going to get an exception. .

以下两种情况之一是正确的。

You might get autofac to work sometimes, because the request still exists, but sometimes won't because the request ends.

或(最有可能)

the execution of QueueBackgroundWorkItem() is outside the lifetime scope so it won't work at all.

因此最终您的服务应该创建它自己的生命周期范围(IDisposable 等)。

关于c# - 在单独的线程中使用实例时使用什么生命周期范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53890849/

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