任务工厂和线程本地存储

Sci*_*ion 1 c# multithreading task task-parallel-library thread-local-storage

我在循环中从任务工厂创建x个任务.当我等待所有任务完成时,这些任务就会完成并做一些工作.

我的问题是每个任务/线程都初始化它自己的昂贵对象的副本,比如DocumentObject.理想情况下,我希望为每个任务/线程重用这个对象,这样当它作为工厂的一部分重新使用时,就不需要重新创建了.

这个ThreadLocal概念在.Net中可能是这样的.

Sco*_*ain 5

您不应该使用ThreadLocal并行任务,如果您有需要处理的资源,除非您在创建对象时跟踪创建的对象,否则很难自行清理.这是因为在ThreadPool上创建了任务,因此无法保证再次返回同一个线程来执行清理工作1.

一种更好的方式来处理,这是使用两种Parallel.For或者Parallel.ForEach是需要在创建是联系在一起的任务,仅在一个时间(命名使用一个线程对象黏巴达localInitlocalFinally).

Parallel.ForEach(GetSomeData(), () => new DocumentObject(),
    (sourceData, loopState, localData)
    {
        //localData is the DocumentObject that unique per thread.

        //...

        return localData; //Passes the class to the next task that is going to use it.
    }
    (localData) => 
    {
        localData.Dispose(); //Do any work here you need to do when a thread is done with the object.
    }
Run Code Online (Sandbox Code Playgroud)

当然,如果您没有任何工作要做,localFinally请继续使用ThreadLocal.


1:新增到4.5,他们添加了Values属性,以便能够再次访问对象,而无需在创建对象时跟踪它们.