gpt4 book ai didi

c# - ThreadLocal 并等待

转载 作者:太空狗 更新时间:2023-10-29 18:22:05 25 4
gpt4 key购买 nike

我们有一个日志系统,我们在其中使用 Log.Info 并将其写入 ILogger

现在我们有多个 worker 在后台运行,我们希望它们写入自己的日志。因此,所有内容都捆绑在每个 Worker 中。执行此任务时记录的所有内容都应转发给它自己的记录器。

我们正在考虑制作一个方法 Log.SetLoggerForCurrentThread,用 ThreadLocal 实现它。执行代码看起来像这样:

public class Worker
{
ILogger _Logger;

public void ExecuteTask()
{
Log.Info( "This goes to the 'Global' logger" );

using ( Log.SetLoggerForCurrentThread(_Logger) )
{
Log.Info( "This goes to local logger" );
DoWork();
}
}

private async void DoWork()
{
Log.Info( "Starting..." );

// SomeMethod does some logging,
// that also needs to be forwared to the local logger
var value = await SomeDeepDomainClass.SomeMethod();

// if we use ThreadLocal, and this thread has been reused,
// it could be a completely different logger that is now attached.
Log.Info( "Ended..." );
}
}

问题

  • 当我们使用 await 时,理论上线程可以在另一个 worker 上工作,从而混淆本地记录器。
  • 做类似事情的最佳模式是什么?我可以使用什么存储方法?
  • CultureInfo 如何处理这个问题?

背景信息

这些 Worker 中的大多数将在 Azure WorkerRole 实例中运行,但有时它们也会从控制台应用程序中触发(一次)。

最佳答案

您可以使用 CallContext 跨线程传递(可序列化的)数据。有关示例,请参阅本文:
https://blog.stephencleary.com/2013/04/implicit-async-context-asynclocal.html

有关一些背景信息,请参阅这篇文章:
https://devblogs.microsoft.com/pfxteam/executioncontext-vs-synchronizationcontext/

关于c# - ThreadLocal 并等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26161991/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com