c# - Web Api——即发即弃

标签 c# rest asp.net-web-api task-parallel-library

我有一个 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/

相关文章:

angularjs - 将额外信息添加到 MongoDB 中的字段 - API RESTful

c# - 验证 Web API 中的 IdentityServer4 token (.Net 框架)

c# - Xamarin 入口控件 TextChanged 事件循环

rest - 使用 Windows Live ID 访问 Windows Azure 服务管理 API

python - HyperlinkedModelSerializer 在 django rest 框架中使用 auth.User 抛出 ImproperlyConfigured 错误

c# - 生成具有角色的身份用户(从 Web API 到 MVC 应用程序)

asp.net-mvc - 尝试解密 FormsAuthentication 票证始终无法验证数据

c# - 返回结果为 "::1"的 Request.UserHostAddress 问题

c# - 在传递给 C 或 C# 中的函数时,数组是否像指针一样工作?

c# - "Don' t name types the same as namespaces”是否适用于命名空间模块?