看起来您正在使用我不熟悉的 BackgroundWorker 类。
但是您还要求使用多线程和 ProgressBar 的“通用”设计。这个例子是我从多个线程更新 ProgressBar 的方式。
首先,您需要一个公共代表(可能在某个助手类中)
//is called when the worker-progress is changed
public delegate void ProgressChangedHandler(object sender, ProgressEventArgs e);
// some own EventArgs
public class ProgressEventArgs : EventArgs
{
public int Percentage { get; private set; }
public string Message { get; private set; }
public ProgressEventArgs(int percentage, string message)
{
Percentage = percentage;
Message = message;
}
}
在每个工人阶级中,您必须注册代表
// event for reporting progress
private event ProgressChangedHandler ProgressChanged;
// register Eventhandler via dependency injection or own method
public void RegisterDelegate(ProgressChangedHandler progressChangedHandler)
{
ProgressChanged += progressChangedHandler;
}
在包含 ProgressBar 的 UI 类中,您需要一个更新进度的方法。但是对该方法的每次调用都在调用者的线程中执行(这对于非线程安全的 UI 可能会出现问题)。
为避免这种情况,您可以调用调度程序,以便每个引发的事件都将在您的 UI 线程而不是工作线程中处理。
private void StatusUpdate(object sender, ProgressEventArgs args)
{
if (Dispatcher.Thread.ManagedThreadId != Thread.CurrentThread.ManagedThreadId)
{
// call from a worker thread
var statusUpdateDelegate = new ProgressChangedHandler(this.StatusUpdate);
Dispatcher.Invoke(statusUpdateDelegate, DispatcherPriority.Normal, sender, args);
}
else
{
// direct call from the UI thread
lblProgress.Content = args.Message;
pbProgress.Value = args.Percentage;
}
}
您可以将此方法作为委托传递给工作人员
worker.RegisterEventHandler(StatusUpdate);
最后,您可以通过每个线程的事件调用委托
public void DoVeryHardWork()
{
// do stuff
ProgressChanged(this, new ProgressEventArgs(progress, "some message"));
}