1. ホーム
  2. c#

BackgroundWorkerを使うには?

2023-10-10 12:12:21

質問

3つのメソッドがあることは知っています。私のプログラムでは、メッセージを送信するメソッドを持っています。それはしばしば遅く、プログラムがボタンを押すことに応答してメッセージをまったく送信しないことがあります。時には5秒も遅れてしまい、プログラムがフリーズしてしまいます。私は BackgroundWorker を使用して、期待通りにメッセージを送信し、プログラムが常に正常に動作するようにしたいのです。ボタンハンドラの中にメッセージを送信するコードがありました。さて、これに相当するコードはどこに置けばいいのでしょうか?私は、このすべてがまだボタンプレスによって処理されることを望みます。

これは適切なハンドラですか?

backgroundWorker1.RunWorkerAsync();

と入っています。

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

ボタンハンドラの中にコードを入れるんですね。 そしてこの前に

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

Cargaは、ProgressBarがある私の他のフォームです。このシナリオでBackgroundWorkerを使用するにはどうすればよいですか?

どのように解決するのですか?

プログレスバーの更新は ProgressChanged または RunWorkerCompleted イベントハンドラは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;
}