我正在做並行編程的第一步。我將CalculateSlots重寫爲CalculateSlotsAsync。它接縫工作正常(快3倍)。並行計算。 NET 4.0
我的問題是:它寫的是否正確? 我是否需要使用最新的異步脫節模式,如果是,如何?
strategy.Slot.AsParallel()
.Where(slot => isCalculateAllSlots || !indicatorSlot.IsCalculated)
.ForAll(slot => CalculateStrategySlot(slot.SlotNumber));
然而,你的情況:
private void CalculateSlots(bool isCalculateAllSlots)
{
foreach (IndicatorSlot indicatorSlot in strategy.Slot)
{
if (isCalculateAllSlots || !indicatorSlot.IsCalculated)
CalculateStrategySlot(indicatorSlot.SlotNumber);
}
}
private void CalculateSlotsAsync(bool isCalculateAllSlots)
{
var tasks = new List<Task>();
foreach (IIndicatorSlot indicatorSlot in strategy.Slot)
{
if (isCalculateAllSlots || !indicatorSlot.IsCalculated)
{
IIndicatorSlot slot = indicatorSlot;
Task task = Task.Factory.StartNew(() => CalculateStrategySlot(slot.SlotNumber));
tasks.Add(task);
}
}
Task.WaitAll(tasks.ToArray());
}
上i7-3630QM測試@ 2.40Gh
// Executed for 96 sec.
for (int i = 0; i < 1000; i++)
CalculateSlots(true);
// Executed for 34 sec.
for (int i = 0; i < 1000; i++)
CalculateSlotsAsync(true);
代碼審查不是SO的目的。代碼看起來不錯,但可以用(P)Linq和/或Parallel.ForEach()簡化。 –
我使用兩年以來的SO,但仍不明白它的目的究竟是什麼。我真的很害怕在這裏問問題或者特別回答。在這裏閱讀詢問在其他地方... –
@MiroslavPopov:我認爲Henk意味着[代碼評論](http://codereview.stackexchange.com/)網站可能更適合這些類型的問題。但不要害怕提問;可能發生的最糟糕的情況是它會在沒有收到任何答案的情況下關閉。 – Douglas