使用Parallel.Foreach()
时,有一种内置机制来实现线程本地数据。使用PLINQ AsParallel()
时,我需要类似的东西。
我希望能够编写PLINQ语句,例如list.AsParallel().ProcessElement(threadlocalresource)
。
ThreadLocal<T>
可能会有所帮助,但我不明白在PLINQ语句完成后如何处置资源。
我查看了AsParallel()
的源代码,希望能够通过大量的依赖来添加该功能并在兔子洞中找到最终的功能......并不是很容易实现。
答案 0 :(得分:3)
PLINQ确实没有对线程局部数据的任何明确支持。如果您仍然认为这是最佳组合,则可以使用ThreadLocal<T>
及其Values
属性进行清理。例如:
using (var threadLocal = new ThreadLocal<SomeType>())
{
result = list.AsParallel().Select(/* use threadLocal.Value here */).ToList();
foreach (var resource in threadLocal.Values)
{
resource.Dispose();
}
}