【发布时间】:2020-07-27 12:34:29
【问题描述】:
我正在开发 Blazor 应用程序。
当用户填写表单时,需要将数据保存到表格中,并且需要运行更长的任务。
用户不需要等待这个更长的任务完成。稍后会通知他。
但是当长任务完成时,需要更新表条目。
如何做到这一点?
这是我当前的代码,它会阻止用户直到所有操作完成:
public async Task<Client> Create(Client client)
{
client.DatabaseCreated = false;
await _context.Clients.AddAsync(client);
await _context.SaveChangesAsync();
Debug.WriteLine("Client added");
// Run longer task.
try
{
// TODO: Don't wait for it:
var longTask= myLongTask(client.Code, client.Id);
// update table entry
client.DatabaseCreated = true;
var updateClient = _context.SaveChangesAsync();
await Task.WhenAll(longTask, updateClient);
Debug.WriteLine("Client updated");
}
catch (Exception e)
{
Console.WriteLine(e);
throw;
}
Debug.WriteLine("Client returned");
return client;
}
【问题讨论】:
-
使用
Task.Run在线程池线程上启动任务,忘记create方法中返回的任务。但请注意_context的生存时间。传递给Task.Run的委托应该在 db-context 上创建它。 -
@Ackdari 同意。要创建
dbcontext,您可以参考stackoverflow.com/a/48368934/9695286 & stackoverflow.com/a/39126718/9695286 -
ASP.NET 中的即发即弃有点棘手 - 确保您了解所涉及的风险。例如,请参阅github.com/StephenCleary/AspNetBackgroundTasks
-
@CamiloTerevinto:尽管解决方案可能不同,但问题(不保证后台任务完成)在 ASP.NET Core 中是一样的,还是不是?
标签: c# asp.net-core async-await fire-and-forget