私はParallel.ForEach
パターンを実装しようとしており、進行状況を追跡しようとしていますが、ロックに関しては何か不足しています。次の例では、threadCount = 1
の場合は1000にカウントされますが、threadCount
> 1の場合はカウントされません。これを行う正しい方法は何ですか。適切なParallel.ForEachのロックと進捗状況の報告
class Program
{
static void Main()
{
var progress = new Progress();
var ids = Enumerable.Range(1, 10000);
var threadCount = 2;
Parallel.ForEach(ids, new ParallelOptions { MaxDegreeOfParallelism = threadCount }, id => { progress.CurrentCount++; });
Console.WriteLine("Threads: {0}, Count: {1}", threadCount, progress.CurrentCount);
Console.ReadKey();
}
}
internal class Progress
{
private Object _lock = new Object();
private int _currentCount;
public int CurrentCount
{
get
{
lock (_lock)
{
return _currentCount;
}
}
set
{
lock (_lock)
{
_currentCount = value;
}
}
}
}
ありがとう、まさに何が起きているのですか? Progressの追加メソッドを追加して、ロックを適用してカウンタを増やしました。 –
変数progressLockは "進捗状況"になるはずですか? – eschneider