gpt4 book ai didi

c# - 通过多线程提高性能

转载 作者:行者123 更新时间:2023-11-30 22:42:38 25 4
gpt4 key购买 nike

我现在正尝试通过使其成为多线程来提高 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 方法之间共享。而且很难让它们都是线程安全的!我做错了什么吗?有什么好的解决办法吗?谢谢!

最佳答案

尝试使用 ParallelEnumerable.AsParallel .

data.AsParallel.ForEach(DoWork);

它会根据处理器/内核的数量自动创建线程。唯一的问题是它包含在 Framework 4.0 中。有关 PLINQ 的更多信息. (正如 andras 评论的那样:对于 framwork 3.5,它可以作为独立的 Reactive Extensions (Rx) )

UPD:正如 0xA3 所说,强烈建议重构代码,使每个项目都有自己的计算变量。我建议你将计算逻辑提取到DataItem

或者创建像“Calculator”这样的特殊类,它将完成所有工作,因此 DataItem 将只存储数据,而计算逻辑将包含在 Calculator 类中。

data.AsParallel.ForEach(x=> new Calculator().DoWork(x));

计算器类是这样的

class Calculator
{
// variables here

void DoWork(DataItem item)
{
Step1(item);
Step2(item);
// ...
// StepN(item);
}
}

关于c# - 通过多线程提高性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4323750/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com