我创建了一个自定义记录器,该记录器将消息发送到服务总线队列。我的问题是Microsoft.Extensions.Logging.ILogger没有异步Log方法,因此必须同步调用异步方法,这可能会导致问题。
_queueClient.SendAsync(message).Wait();
所以我的问题是,在不引起线程饥饿的情况下,最安全的方法是什么?
答案 0 :(得分:1)
Net Core日志记录专门设计为不使用异步方法。他们认为日志记录应该足够快,不需要它。
”日志记录应如此之快,以至于不值得 异步代码。”
https://docs.microsoft.com/en-us/aspnet/core/fundamentals/logging/?view=aspnetcore-2.2
建议,如果需要记录这样的内容,请改用“批处理记录器”。
”相反,将日志消息同步添加到内存队列中并具有 后台工作人员将消息从队列中拉出以执行 将数据推送到SQL Server的异步工作。”
因此,基本上,您应该将队列调用移至后台工作程序(HostedService)中,并使其在后台工作程序中进行异步调用。常规的“记录器”方法应调用将消息放入MemoryCache队列的内容或类似内容,然后后台工作人员将在后台从那里获取内容。我敢肯定,Azure Logger的例子很简单