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 MVC 创建 Web API