Sci*_*ion 1 c# multithreading task task-parallel-library thread-local-storage
我在循环中从任务工厂创建x个任务.当我等待所有任务完成时,这些任务就会完成并做一些工作.
我的问题是每个任务/线程都初始化它自己的昂贵对象的副本,比如DocumentObject.理想情况下,我希望为每个任务/线程重用这个对象,这样当它作为工厂的一部分重新使用时,就不需要重新创建了.
这个ThreadLocal概念在.Net中可能是这样的.
您不应该使用ThreadLocal并行任务,如果您有需要处理的资源,除非您在创建对象时跟踪创建的对象,否则很难自行清理.这是因为在ThreadPool上创建了任务,因此无法保证再次返回同一个线程来执行清理工作1.
一种更好的方式来处理,这是使用两种Parallel.For或者Parallel.ForEach是需要在创建是联系在一起的任务,仅在一个时间(命名使用一个线程对象黏巴达localInit和localFinally).
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属性,以便能够再次访问对象,而无需在创建对象时跟踪它们.
| 归档时间: |
|
| 查看次数: |
1698 次 |
| 最近记录: |