Como fazer Parallel.ForEach adequado, bloqueio e relatório de progresso

Estou tentando implementar oParallel.ForEach padrão e acompanhar o progresso, mas estou faltando alguma coisa sobre o bloqueio. O exemplo a seguir conta para 1000 quando othreadCount = 1, mas não quando othreadCount > 1. Qual é a maneira correta de fazer isso?

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;
         }
      }
   }
}

questionAnswers(6)

yourAnswerToTheQuestion