gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 00:25:54 25 4
gpt4 key购买 nike

我想将日志记录上下文信息存储在 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/

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