进度条和后台工作线程后台运行方法

本文关键字:后台 线程 运行 方法 工作 | 更新日期: 2023-09-27 18:35:55

我在表单中创建了一个后台工作进程。

 BackgroundWorker bw = new BackgroundWorker
        {
            WorkerReportsProgress = true,
            WorkerSupportsCancellation = true
        };  

另外,我在表单中有一个进度条控件(进度条最小值和最大值为 1 和 100)。

在我的按钮点击中,

其中 click 事件将触发应该在后台并行运行的实际方法调用,开始显示进度条步骤。

if (bw.IsBusy)
 {
    return;
 }
 bw.DoWork += (bwSender, bwArg) =>
 {
   MethodCall1(); - Does some database insertions..
   MethodCall2(); - Does some database select...
 }
bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);
bw.RunWorkerCompleted += (bwSender, bwArg) =>
{
  bw.Dispose();                  
};
bw.RunWorkerAsync();

对于进度条显示进度...

void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
   progressBar.Value = e.ProgressPercentage;
}

我面临的问题是,进度条没有步进,它停滞不前,没有进度条的进度。

我也尝试插入 bw。报告进度(整数值)在我的实际方法中,但是,它没有帮助。

我怎样才能有一个后台工人线程处理方法调用并并行显示进度条的进度,方法调用完成后,我想结束进度条步骤。

进度条和后台工作线程后台运行方法

正如注释中的其他人所述,您应该将事件的连接移动到窗体构造函数或初始化方法。如果在每次单击按钮时将它们添加到 BackgroundWorker 中,则这些方法将在第二次单击时执行两次,在第三次单击时执行三次,依此类推。

尝试将 ReportProgress 调用放在 DoWork 代码中的方法调用之后。正如 Hans 上面所说,除非你非常清楚你的方法调用相对于彼此需要多长时间,否则这并不能真正准确地表示进度。

至于Dispose,BackgroundWorker 继承自 Component,它实现了 IDisposable。但是,BackgroundWorker 不会重写基本实现以实际释放任何内容,因此调用它只是将其从组件集合中删除。它不需要显式调用。

尝试这样的事情:

public partial class Form1 : Form
{
    BackgroundWorker bw = new BackgroundWorker
    {
        WorkerReportsProgress = true,
        WorkerSupportsCancellation = true
    };  
    public Form1()
    {
        InitializeComponent();
        bw.DoWork += (bwSender, bwArg) =>
        {
            //MethodCall1(); - Does some database insertions..
            bw.ReportProgress(50);
            //MethodCall2(); - Does some database select...
            bw.ReportProgress(100);
        };
        bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);
        bw.RunWorkerCompleted += (bwSender, bwArg) =>
        {
        };
    }
    private void button1_Click(object sender, EventArgs e)
    {
        if (bw.IsBusy)
        {
            return;
        }
        bw.RunWorkerAsync();
    }
    void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        progressBar1.Value = e.ProgressPercentage;
    }
}