一尘不染

如何使用BackgroundWorker?

c#

我知道它有3种方法。在我的程序中,我有一种发送消息的方法。通常会很晚,并且程序有时根本不发送响应按钮按下的消息。有时可能比我期望的要晚5秒,程序会冻结。我想使用a
BackgroundWorker来按预期发送消息,并允许程序始终正常运行。我有用于在按钮处理程序中发送消息的代码。现在,我将这些等效代码放在哪里?我希望所有这些仍然可以通过按按钮来处理。

这是合适的处理程序吗?

backgroundWorker1.RunWorkerAsync();

并在:

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) {}

我要把我的代码放在按钮处理程序中吗?并且在此之前:

carga.progressBar1.Minimum = 0;
carga.progressBar1.Maximum = 100;

Carga是ProgressBar所在的另一种形式。在这种情况下如何使用BackgroundWorker?


阅读 225

收藏
2020-05-19

共1个答案

一尘不染

您只能从ProgressChangedRunWorkerCompleted事件处理程序更新进度条,因为它们与UI线程同步。

基本思想是。Thread.Sleep只是在这里模拟一些工作。将其替换为您的真实路由呼叫。

public Form1()
{
    InitializeComponent();

    backgroundWorker1.DoWork += backgroundWorker1_DoWork;
    backgroundWorker1.ProgressChanged += backgroundWorker1_ProgressChanged;
    backgroundWorker1.WorkerReportsProgress = true;
}

private void button1_Click(object sender, EventArgs e)
{
    backgroundWorker1.RunWorkerAsync();
}

private void backgroundWorker1_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
{
    for (int i = 0; i < 100; i++)
    {
        Thread.Sleep(1000);
        backgroundWorker1.ReportProgress(i);
    }
}

private void backgroundWorker1_ProgressChanged(object sender, System.ComponentModel.ProgressChangedEventArgs e)
{
    progressBar1.Value = e.ProgressPercentage;
}
2020-05-19