C# 在API向web客户端返回响应后,在保存数据时是否可以保留DbContext?

C# 在API向web客户端返回响应后,在保存数据时是否可以保留DbContext?,c#,asp.net-core-webapi,C#,Asp.net Core Webapi,我正在使用ASP.NETCore3.1。我构建了一个Web API,它生成大量随机数据,并使用EF core将其保存到数据库中。这需要一段时间来保存 我希望在上下文继续保存时将响应返回到客户端 我尝试过使用DBContext.savechangesync,但没有调用wait/await方法(因此执行继续,API方法返回OK到调用的Web UI),似乎一旦WebAPI方法返回,save就会停止执行save。您可以使用后台线程和IServiceScopeFactory来实现这一点。我已经为我的一个项

我正在使用ASP.NETCore3.1。我构建了一个Web API,它生成大量随机数据,并使用EF core将其保存到数据库中。这需要一段时间来保存

我希望在上下文继续保存时将响应返回到客户端


我尝试过使用DBContext.savechangesync,但没有调用wait/await方法(因此执行继续,API方法返回OK到调用的Web UI),似乎一旦WebAPI方法返回,save就会停止执行save。

您可以使用
后台线程
IServiceScopeFactory来实现这一点。我已经为我的一个项目做了类似的事情,这里是示例代码

public static void StartRandomDataThread(this IServiceScopeFactory serviceScopeFactory)
{
    Thread worker = new Thread(async () => await SaveRandomData(serviceScopeFactory))
    {
        IsBackground = true
    };
    worker.Start();
}

private static async Task SaveRandomData(IServiceScopeFactory serviceScopeFactory)
{
    using (var scope = serviceScopeFactory.CreateScope())
    {
        var dbContext = scope.ServiceProvider.GetRequiredService<ApplicationDbContext>();
        
        //Or you can pass list of data as parameter while starting the thread
        var someRandomData = ....;
        
        foreach (var data in someRandomData)
        {
            dbContext.Add(data);        
        }
        
        await dbContext.SaveChangesAsync();
    };
}

您将从依赖项的构造函数注入中获得
\u serviceScopeFactory

是的,这是可能的。生成数据,并将其返回给客户端。在返回之前,请使用
任务
进行保存。您可能需要重新设置生存期作用域(或IoC容器中的等效作用域),以确保上下文不会在web请求结束时关闭。当然,您可能会向客户端返回未成功保存的数据(例如,数据库关闭)。感谢您的回复。我试着使用这个任务。但我不知道如何“创建一个新的终身范围”@mjwills您使用的是什么IoC容器?最后使用任务运行我需要的代码,但也注入了一个IServiceScopeFactory实例,然后我用它创建了一个新的作用域和上下文,然后用它保存数据。这似乎奏效了
_serviceScopeFactory.StartRandomDataThread();
//continue the execution