我有一个 Web API 的操作,我需要在其中运行一些任务并忘记这个任务。 这就是我的方法现在的组织方式:
public async Task<SomeType> DoSth()
{
await Task.Run(...);
.....
//Do some other work
}
问题是,它显然在等待线停止,等待完成后才继续工作。 我需要“解雇后忘记” 我应该只调用 Task.Run() 而没有任何异步等待吗?
最佳答案
And I need to "fire and forget"
我有一篇博文详细介绍了 fire-and-forget on ASP.NET 的几种不同方法。 .
总而言之:首先,尽量不要做到“即发即弃”。这几乎总是一个坏主意。你真的想“忘记”吗?就像,不关心它是否成功完成?忽略任何错误?在没有任何日志通知的情况下接受偶尔的“丢失的工作”?几乎总是,答案是否定的,即发即弃不是合适的方法。
一个可靠的解决方案是构建一个合适的分布式架构。也就是说,构造一个表示要完成的工作的消息并将该消息排队到可靠的队列(例如,Azure 队列、MSMQ 等)。然后有一个独立的后端来处理该队列(例如,Azure WebJob、Win32 服务等)。
Should I just call Task.Run() without any async-await?
没有。这是最糟糕的解决方案。如果您必须做到即发即弃,并且您不愿意构建分布式架构,那么请考虑 Hangfire。如果这对您不起作用,那么至少非常您应该通过 HostingEnvironment.QueueBackgroundWorkItem
或我的 ASP.NET Background Tasks library 向 ASP.NET 运行时注册您的牛仔背景工作。 .请注意,QBWI 和 AspNetBackgroundTasks 都是不可靠的解决方案;它们只是最小化您失去工作的可能性,而不是阻止它。
关于c# - Web Api——即发即弃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36335345/