【发布时间】: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
【问题讨论】:
标签: asp.net-core-webapi fire-and-forget
我在我的 asp.net core 2.2 web api 中记录每个请求。我通过为 Fire and Forget 旋转 Task.Run 方法将日志发布到外部服务器。但它抛出异常并影响主线程。有什么办法可以在 asp.net core web api 中实现 Fire and Forget 吗?
谢谢, Subbiah K
【问题讨论】:
标签: asp.net-core-webapi fire-and-forget
如果你的日志方法是这样的异步方法:
public async Task SendLog(Log mylog)
{
// some async logic.
}
你可以简单地调用它:
SendLog(log).ConfigureAwait(false);
发送过程将继续,不会阻塞您当前的线程。
参考:https://stackoverflow.com/a/53184241/8676371
但如果你想异步处理异常,你可以这样做:
SendLog(log).
ContinueWith(t => Console.WriteLine(t.Exception), TaskContinuationOptions.OnlyOnFaulted);
这将允许您处理除“主”线程之外的线程上的异常。这意味着您不必“等待”来自原始线程的调用 SendLog();但是,仍然允许您在异常情况下执行某些操作——但前提是发生异常。
【讨论】:
SynchronizationContext,因此ConfigureAwait 无效。但是,这并不意味着您不能使用它,我认为实际上最好始终使用它,就像您重构此代码并在其他非 ASP.NET Core 的地方使用它一样,那么这将非常重要。