C#:我可以通过调用Action Delegate从DLL更新进度条吗
本文关键字:更新 DLL Delegate 可以通过 调用 Action | 更新日期: 2023-09-27 17:59:21
我已经花了整整一周的时间研究这个问题,但事情对我来说不起作用。
我有一个带有进度条的WPF
用户界面。我的业务逻辑在一个单独的DLL中。我想从DLL中更新进度条。我在UI端有一个SetProgress(int)
方法。我将这个方法作为Action委托传递给DLL,并从DLL中调用它来更新进度。但我注意到进度条并没有实时更新。相反,在完成所有处理之后,进度条突然达到100%,这不是理想的行为。
我也尝试过BackGroundWorker,但也无法获得实时进度条更新。以下是我对BackGroundWorker方式的方法:
UI代码:
public partial class MainWindow : Window
{
public BackgroundWorker bw;
public MainWindow()
{
bw = new BackgroundWorker();
bw.WorkerReportsProgress = true;
ProgressChangedEventHandler(OnProgressChanged);
}
public void OnProgressChanged(object sender, ProgressChangedEventArgs args)
{
SetProgress(args.ProgressPercentage);
}
public void SetProgress(int progress)
{
progressBar.Text = percent.ToString();
}
public void btn_click()
{
DoSomething(bw);
}
}
DLL代码:
Public void DoSomething(BackgroundWorker bw)
{
bw.DoWork += new DoWorkEventHandler(bw_DoWork);
bw.RunWorkerAsync();
}
public void bw_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;
for (int i = 0; i < 100; i++)
{
worker.ReportProgress(i + 1);
}
}
我不知道哪里出了问题,因为这段代码也没有实时更新进度条。
在BackgroundWorker上将事件ProgressChanged
与OnProgressChanged
方法"挂钩"在哪里?扩展MainWindow
构造函数:
public MainWindow()
{
bw = new BackgroundWorker();
bw.WorkerReportsProgress = true;
// this....
bw.ProgressChanged += OnProgressChanged;
}
别忘了,如果您想从WPF中的另一个线程更新UI元素,则必须在Dispatcher
(线程)上调用它。
示例:
public void OnProgressChanged(object sender, ProgressChangedEventArgs args)
{
this.Dispatcher.Invoke( () => SetProgress(args.ProgressPercentage) );
}
public void SetProgress(int progress)
{
progressBar.Text = percent.ToString();
}
通过这种方式,UI元素在右侧线程上进行更新。
以下是有关更新其他线程上的UI控件的更多信息:使用Dispatcher从非主线程更改WPF控件。调用