7

BackgroundWorkerすべて、 WinForm で複数のスレッドのケースを処理するための基本的な使用法は既に知っていました。コード構造は以下のようになります。

アプリケーションのメインスレッドで。BackgroundWork を開始するだけです。

    if (backgroundWorker1.IsBusy != true)
    {
        // Start the asynchronous operation.
        backgroundWorker1.RunWorkerAsync();
    }

次に、DoWorkイベントを発生させます。それで、そこで何かをすることができます。

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    BackgroundWorker worker = sender as BackgroundWorker;
    ......
    // report progress.
    worker.ReportProgress(iProgress);
    ....
}

次に、ProgressChangedイベントを処理して BackgroundWorker の進行状況を表示するだけです。

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    //show progress.   
    resultLabel.Text = (e.ProgressPercentage.ToString() + "%");
}

終了後DoWork、または何らかの例外が発生しました。イベントRunWorkerCompletedが発生します。

このイベント ハンドルに関する質問があります。それらを確認するのを手伝ってください。ありがとう。

に「結果」という名前のプロパティがあることに気付きましたRunWorkerCompletedEventArgs e。何に使用しますか? どのように使用できますか?

代わりにカスタム例外メッセージを受け取る可能性はありますe.errorか? あるなら、どうやって作るの?

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    if (e.Cancelled == true)
    {
        resultLabel.Text = "Canceled!";
    }
    else if (e.Error != null)
    {
        resultLabel.Text = "Error: " + e.Error.Message;
    }
    else
    {
        resultLabel.Text = e.Result.ToString();
    }
}
4

3 に答える 3

16

Resultプロパティ inは、 inのRunWorkerCompletedEventArgsResult プロパティに割り当てた値です。DoWorkEventHandlerDoWork()

これには好きなものを割り当てることができるので、整数、文字列、オブジェクト/複合型などを返すことができます.

で例外がスローされた場合、のプロパティでDoWork()例外にアクセスできます。この状況で Result プロパティにアクセスすると、がスローされます。ErrorRunWorkerCompletedEventArgsTargetInvocationException

于 2013-11-01T09:18:37.990 に答える
6
public class MyWorkerClass
{
    private string _errorMessage = "";
    public string ErrorMessage { get { return _errorMessage; } set { _errorMessage = value; }}

    public void RunStuff(object sender, DoWorkEventArgs e)
    {
        //... put some code here and fill ErrorMessage whenever you want
    }
}

次に、それを使用するクラス

public class MyClassUsingWorker
{
    // have reference to the class where the worker will be running
    private MyWorkerClass mwc = null;

    // run the worker
    public void RunMyWorker()
    {
        mwc = new MyWorkerClass();
        BackgroundWorker backgroundWorker1 = new BackgroundWorker();
        backgroundWorker1.DoWork += new DoWorkEventHandler(mwc.RunStuff);
        backgroundWorker1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted);
        backgroundWorker1.RunWorkerAsync();
    }

    private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        string strSpecialMessage = mwc.ErrorMessage;

        if (e.Cancelled == true)
        {
            resultLabel.Text = "Canceled!";
        }
        else if (e.Error != null)
        {
            resultLabel.Text = "Error: " + e.Error.Message;
        }
        else
        {
            resultLabel.Text = e.Result.ToString();
        }
    }
}
于 2013-11-01T11:38:13.573 に答える
0

Result プロパティを使用して、DoWork からの結果を格納し、Completed イベントからアクセスできます。ただし、バックグラウンド ワーカー プロセスがキャンセルされた場合や例外が発生した場合は、結果にアクセスできません。詳細については、こちらをご覧ください。

于 2013-11-01T09:28:53.007 に答える