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

我不知道哪里出了问题,因为这段代码也没有实时更新进度条。

C#:我可以通过调用Action Delegate从DLL更新进度条吗

在BackgroundWorker上将事件ProgressChangedOnProgressChanged方法"挂钩"在哪里?扩展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控件。调用