我想将日志记录上下文信息存储在 TLS 中,以便可以在入口点设置一个值,并使该值在所有结果堆栈中可用。这工作得很好,但我还使用了 TPL 和 ThreadPool。那么问题就变成了如何将 TLS 数据迁移到其他线程。我可以自己完成这一切,但是我会失去像 Parallel.For 这样的好方法。
使用 TPL 时是否可以通过某种方式复制 TLS?当 C# 获得等待功能时,这也适用于它。
谢谢,
埃里克
通常,这是通过使用重载来处理的并行.For http://msdn.microsoft.com/en-us/library/dd783299.aspx#Y0它已经提供了线程本地数据。
此重载允许您提供初始化和终结委托,这实际上成为线程本地数据的每个线程的初始化,以及最后的缩减函数以将结果“合并”在一起(每个线程运行一次)。我在这里详细写了这一点 http://reedcopsey.com/2010/01/22/parallelism-in-net-part-4-imperative-data-parallelism-aggregation/.
基本形式是执行以下操作:
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;
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)