Попытка отслеживать ход цикла Parallel.ForEach Я попробовал предложение, выдвинутое в этом вопросе , но, к сожалению, я все еще не смог выполнить то, что хотел.
В основномПервая проблема, с которой я столкнулся, когда попытался предложить реализацию (используя таймер), заключалась в том, что метод Parallel.ForEach является блокирующим вызовом, и, следовательно, обратный вызов по таймеру не выполнялся.
Поэтому я попытался поместить Parallel.ForEach цикл внутри фонового рабочего потока.Который на самом деле допустил событие таймера, но значение моего счетчика никогда не обновляется до тех пор, пока не завершится операция ForEach.
Вот основная идея кода (с фоновым работником).
private StockList _StockListToProcess = null;
private static Int64 ItemsProcessed = 0;
private System.Windows.Threading.DispatcherTimer _timer = null;
private System.ComponentModel.BackgroundWorker _backWorker = null;
progressBar1.Minimum = 1;
progressBar1.Maximum = this._StockListToProcess.Count;
MainWindow.ItemsProcessed = 0;
this._timer = new System.Windows.Threading.DispatcherTimer();
this._timer.Interval = TimeSpan.FromMilliseconds(100);
this._timer.Tick += timer_Tick;
this._timer.Start();
this._backWorker = new System.ComponentModel.BackgroundWorker();
this._backWorker.DoWork += delegate(object o, System.ComponentModel.DoWorkEventArgs args)
{
Parallel.ForEach(this._StockListToProcess, new ParallelOptions() { MaxDegreeOfParallelism = 5 },
(Stock stock) =>
{
MyWebServiceClient serviceClient = new MyWebServiceClient ();
MyWebServiceClient.ResponseEnum result = (MyWebServiceClient .ResponseEnum)serviceClient.SetProductPricing(token.LoginName, token.LoginPassword, token.SiteID.ToString(), stock.ProductCode, stock.ProductPrice);
System.Threading.Interlocked.Increment(ref MainWindow.ItemsProcessed);
});
this._timer.Stop();
};
private void timer_Tick(object sender, EventArgs e)
{
progressBar1.Value = MainWindow.ItemsProcessed;
}
Чего мне не хватает?