Asp.net core web Api Fire and Forget BG task

Posted

技术标签:

【中文标题】Asp.net core web Api Fire and Forget BG task【英文标题】: 【发布时间】:2020-03-05 06:50:51 【问题描述】:

我在我的 asp.net core 2.2 web api 中记录每个请求。我通过为 Fire and Forget 旋转 Task.Run 方法将日志发布到外部服务器。但它抛出异常并影响主线程。有什么办法可以在 asp.net core web api 中实现 Fire and Forget 吗?

谢谢, Subbiah K

【问题讨论】:

【参考方案1】:

如果你的日志方法是这样的异步方法:

public async Task SendLog(Log mylog)

    // some async logic.

你可以简单地调用它:

SendLog(log).ConfigureAwait(false);

发送过程将继续,不会阻塞您当前的线程。

参考:https://***.com/a/53184241/8676371


但如果你想异步处理异常,你可以这样做:

  SendLog(log).
    ContinueWith(t => Console.WriteLine(t.Exception), TaskContinuationOptions.OnlyOnFaulted);

这将允许您处理除“主”线程之外​​的线程上的异常。这意味着您不必“等待”来自原始线程的调用 SendLog();但是,仍然允许您在异常情况下执行某些操作——但前提是发生异常。

参考:https://***.com/a/15524271/8676371

【讨论】:

但我读到的是,configureAwait(false) 仅适用于 UI 线程。它不能在 Asp.net 上运行 它有助于不等待当前线程。支持任何平台。试试看。 @user3141198 ASP.NET Core 尤其不使用SynchronizationContext,因此ConfigureAwait 无效。但是,这并不意味着您不能使用它,我认为实际上最好始终使用它,就像您重构此代码并在其他非 ASP.NET Core 的地方使用它一样,那么这将非常重要。

以上是关于Asp.net core web Api Fire and Forget BG task的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Core Web Api 自动帮助页面

ASP.NET Core Web API

Asp.Net Core 1.1 消费web api

使用 ASP.NET Core MVC 创建 Web API

如何从 ASP.NET MVC 到 ASP.NET Core Web API 的 PUT?

ASP.NET Web API 与 ASP.NET Core 中的 URL 匹配差异