.net - 使用 TPL 时如何管理线程本地存储 (TLS)?

标签 .net asynchronous threadpool task-parallel-library thread-local-storage

我想将日志记录上下文信息存储在 TLS 中,以便我可以在入口点设置一个值,并使该值在所有生成的堆栈中都可用。这很好用,但我也使用 TPL 和 ThreadPool。那么问题就变成了如何将 TLS 数据迁移到其他线程。我可以自己做这一切,但是我失去了像 Parallel.For 这样的好方法。

使用 TPL 时有什么方法可以复制 TLS 吗?当 C# 获得 await 功能时,这也将适用于它。

谢谢,
埃里克

最佳答案

通常,这是通过使用 Parallel.For 的重载来处理的。已经提供了线程本地数据。

这个重载允许你提供一个初始化和一个终结委托(delegate),它有效地成为你的线程本地数据的每个线程的初始化,以及最后的归约函数以将结果“合并”在一起(每个线程运行一次)。 I wrote about this in detail here .

基本形式是执行以下操作:

object sync = new object();
double result = 0;

Parallel.For(0, collection.Count, 
    // Initialize thread local data:
    () => new MyThreadSpecificData(),
    // Process each item
    (i, pls, currentThreadLocalData) => 
    {
        // Generate a NEW version of your local state data
        MyThreadSpecificData newResults = ProcessItem(collection, i, currentThreadLocalData);
        return newResults;
    },
    // Aggregate results
    threadLocalData =>
    {
       // This requires synchronization, as it happens once per thread, 
       // but potentially simultaneously
       lock(sync)
          result += threadLocalData.Results;
    });

关于.net - 使用 TPL 时如何管理线程本地存储 (TLS)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7961233/

相关文章:

c# - 如何获取在 C# 中调用的先前方法的参数 IDictionary<string, object>?

c# - WPF - 为什么 ValidationRule 不是 DependencyObject?

c# - 我们可以在 Windows 应用程序中使用 Jquery 吗?

grails 2.3.x 异步和 sleep

c# - 是否有与 StreamReader 的 Peek 方法等效的异步方法?

.net - 使用 System.Threading.Task 将工作项排队到线程池

.net - .net core 源码中如何维护局部变量使用信息

javascript - 如何确保运行异步调用的 foreach 循环完成?

java - 在服务中配置线程池大小

c++ - C++11中的线程池和执行队列