var count = 0; var progressCount = 0; Parallel.For(() => { // ... var localCount = Interlocked.Increment(ref count); Dispatcher.BeginInvoke(() => { if (localCount <= progressCount) return; SetProgress(progressCount = localCount); }) });