【发布时间】:2011-05-18 10:45:33
【问题描述】:
我现在正试图通过使其成为多线程来提高 winform 应用程序的性能。目前该类看起来像:
public class MainClass
{
List<DataItem> data; //thousands of DataItem, but each is independent
//and a lot of non-thread-safe variables here,variable1 variable2 ...
public void Go()
{
data.ForEach(item => DealWithDataItem(item));
}
public void DealWithDataItem(DataItem item)
{
//costs really long time here
Step1(item);
Step2(item); //and a lot of StepN(item)
}
public void StepN(DataItem item)
{
//variable1 = blabla
//variable2 = blabla ..etc
}
}
我想为每个 DataItem 使用ThreadPool。
data.ForEach(item => ThreadPool.QueueUserWorkItem( s => DealWithDataItem(item) ));
但是有这么多非线程安全的变量!我不能在某些方法中声明它们,因为它在 StepN 方法之间共享。而且很难让它们都成为线程安全的!我做错什么了吗?有什么好的解决办法吗?谢谢!
【问题讨论】:
-
backgroundworker 不够用吗?
-
这真的取决于你对你的变量做了什么1..n他们对值求和吗?你读书吗?写?您需要更具体地了解这些变量的使用。不同的使用模式有不同的解决方案。
-
不太明白。是
MainClass某种监视器,用于处理所有DataItem进度的整体进度(因此您需要它们作为MainClass的状态)。如果没有,请考虑为您的每项工作创建单独的对象。 -
在您进一步了解这一点之前,了解这一点很重要:是什么让 Step1 和 Step2 真的很慢?他们在做什么工作?很多运行缓慢的东西都会这样做,因为它们依赖于磁盘或网络等缓慢的东西。在这些情况下,跨多个线程拆分工作通常无济于事。一般来说,在确定如何并行化工作时,工作的性质很重要——你用“blabla ..etc”省略的部分实际上是最重要的部分——你隐藏了人们需要看到才能回答的部分你的问题。
-
你说变量在
StepN方法之间是共享的,但是它们是在不同的线程之间共享的吗?如果不是,那么您收到的答案会有所帮助,但如果它们是,那么您有一个更大的问题......
标签: c# .net multithreading thread-safety threadpool