使用PLINQ AsParallel()来使用线程本地数据

本文关键字:线程 数据 PLINQ AsParallel 使用 | 更新日期: 2023-09-27 17:53:57

当使用Parallel.Foreach()时,有一个内置的机制来实现线程本地数据。当使用PLINQ AsParallel()时,我需要类似的东西。

我希望能够编写PLINQ语句,如list.AsParallel().ProcessElement(threadlocalresource)

ThreadLocal<T>可能会有所帮助,但我不明白PLINQ语句完成后如何处置资源。

我查看了AsParallel()的源代码,希望能有一个副本/补丁来添加这个功能,结果却被大量的依赖项所困扰……这可不容易。

使用PLINQ AsParallel()来使用线程本地数据

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();
    }
}