這是失敗的測試。我如何確認循環運行正確的次數?Parallel.For和Parallel.ForEach沒有運行到結論
public Random Randomator { get; set; }
public const int TimesToRun = 1000000;
[TestMethod]
public void ThrowTheDice()
{
Randomator = new Random();
var resultsParallel = new Dictionary<int, int>
{
{1, 0}, {2, 0}, {3, 0}, {4, 0}, {5, 0}, {6, 0}
};
var resultsParallelForEach = new Dictionary<int, int>
{
{1, 0}, {2, 0}, {3, 0}, {4, 0}, {5, 0}, {6, 0}
};
var stopwatch = new Stopwatch();
stopwatch.Start();
Parallel.For(0, TimesToRun, ctr =>
{
var val = ThrowDice();
if (!resultsParallel.ContainsKey(val))
throw new ArgumentOutOfRangeException();
var existing = resultsParallel[val];
resultsParallel[val] = existing + 1;
});
stopwatch.Stop();
var parallelTime = stopwatch.Elapsed;
stopwatch = new Stopwatch();
stopwatch.Start();
var numbers = Enumerable.Range(0, TimesToRun);
Parallel.ForEach(numbers, ctr =>
{
var val = ThrowDice();
if (!resultsParallel.ContainsKey(val))
throw new ArgumentOutOfRangeException();
var existing = resultsParallelForEach[val];
resultsParallelForEach[val] = existing + 1;
});
stopwatch.Stop();
var parallelForEachTime = stopwatch.Elapsed;
var parallelTotal = resultsParallel.Sum(x => x.Value);
var parallelForEachTotal = resultsParallelForEach.Sum(x => x.Value);
Assert.AreEqual(parallelTotal, TimesToRun);
Assert.AreEqual(parallelForEachTotal, TimesToRun);
}
public int ThrowDice()
{
return Randomator.Next(1, 7);
}
'我如何確認循環運行正確次數?'它們運行的次數正確,但是您可以訪問未受控制的共享對象。 –