我已将代码中的 for 循环替换为 Parallel.For。性能提升非常棒(1/3 的运行时间)。我尝试使用数组来解释共享资源以收集结果代码。然后我在 Parallel.For 之外处理数组。这是最有效的方法还是即使没有迭代可以共享相同的循环索引,阻塞仍然会发生? CompareExchange 会表现得更好吗?
int[] pageResults = new int[arrCounter];
Parallel.For(0, arrCounter, i =>
{
AlertToQueueInput input = new AlertToQueueInput();
input.Message = Messages[i];
pageResults[i] = scCommunication.AlertToQueue(input).ReturnCode;
});
foreach (int r in pageResults)
{
if (r != 0 && outputPC.ReturnCode == 0) outputPC.ReturnCode = r;
}
最佳答案
这取决于您在主循环中是否有任何(有值(value)的)副作用。
当 outputPC.ReturnCode
是唯一的结果时,您可以使用 PLINQ:
outputPC.ReturnCode = Messages
.AsParallel()
.Select(msg =>
{
AlertToQueueInput input = new AlertToQueueInput();
input.Message = msg;
return scCommunication.AlertToQueue(input).ReturnCode;
})
.FirstOrDefault(r => r != 0);
这假定 scCommunication.AlertToQueue() 是线程安全的,并且您不想在第一个错误后为剩余的项目调用它。
请注意,PLinq 中的 FirstOrDefault() 仅有效 in Framework 4.5 and later .
关于c# - 优化 Parallel.For 的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30346774/