在不等待的情况下完成行动中的任务-任务被取消



我有一个异步操作,它完成了一个我需要等待的任务,然后再向cliend返回响应,还有一个我想运行的任务,但我不在乎结果。

[HttpPost]
[Route("api/update")]
public async Task Update(Competence competence)
{            
await _competenceService.Update(competence);
_userService.DoNotWaitForMe(competence.Year);
}

_competenceService_userService类都是通过DI作为Scoped注入控制器的,并且它的两种方法都是可用的。我还使用实体框架并注入上下文类

// Startup.cs
services.AddScoped<ICompetenceService, CompetenceService>();
services.AddScoped<IUserService, UserService>();
services.AddDbContext<DbContext>(options =>
{
options.UseSqlServer(Configuration.GetConnectionString("DbContext"));
});
// CompetenceService.cs
async Task Update(Competence competence)
// UserService.cs
async Task DoNotWaitForMe(int Year)

当等待中的Update方法按预期完成(或在异常时抛出Exception(时,后者永远不会完成,并抛出异常

System.Threading.Tasks.TaskCanceledException:任务已取消。在Microsoft.EntityFrameworkCore.Storage.RelationConnection.OpenDbConnectionAsync(布尔errors预期,CancellationToken取消令牌(Microsoft.EntityFrameworkCore.Storage.RelationConnection.OpenDbConnectionAsync(布尔errors预期,CancellationToken取消令牌(Microsoft.EntityFrameworkCore.Storage.RelationConnection.OpenAsync(CancellationTokencancelloToken,布尔错误(预期(Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteReaderAsync(RelationalCommonandParameterObjectparameterObject,CancellationToken CancellationToken(Microsoft.EntityFrameworkCore.Query.RelationShapedQueryCompilingExpressionVisitor.AsyncQueryingEnumerable1.AsyncEnumerator.MoveNextAsync() at Microsoft.EntityFrameworkCore.EntityFrameworkQueryableExtensions.ToListAsync[TSource](IQueryable1source,CancellationToken CancellationToken(Microsoft.EntityFrameworkCore.EntityFrameworkQueryableExtensions.ToListAsync[TSource](IQueryable `1来源,CancellationToken CancellationToken(

有时也包括

System.ObjectDisposedException:无法访问已释放的对象。A.该错误的常见原因是处理已解决的上下文从依赖项注入,然后稍后尝试使用应用程序中其他位置的上下文实例。如果您正在对上下文调用Dispose((,或将上下文包装在using语句。如果您正在使用依赖项注入,您应该让依赖注入容器负责处理上下文实例。

我想阻止DI(或任何负责人(取消任务,并处理所有对象,直到这个异步任务完成。有办法吗?

简单地说,您不能只是不等待任务。EF上下文有一个作用域生存期:它在请求开始时被实例化,在请求完成时被释放。如果返回响应,则在对上下文所做的工作完成之前,将处理上下文,并抛出ObjectDisposedException

不等待任务总是错误的,尤其是在网络应用程序中。这是而不是相同的背景。如果你想在后台做一些事情,那么你需要在实际的后台服务上安排它。这可能是任何东西:一个单独的进程、一个控制台应用程序、一个Azure功能或一个托管服务。长话短说,你需要做一些实际上打算在后台处理任务的工作,而不仅仅是即发即弃任务。

最新更新