2013-11-01 7 views
5

すべて、私はすでに基本的な使用方法を知っています.WindFormで複数のスレッドのケースを処理するにはBackgroundWorkerです。コード構造は以下のようになります。BackgroundWorkerイベントの使用方法RunWorkerCompleted

アプリケーションのメインスレッドです。 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の代わりに私のカスタム例外メッセージを受け取る可能性はありますか?もしあれば、それを作る方法? RunWorkerCompletedEventArgs

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

答えて

13

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

例外は、あなたがで例外にアクセスすることができますDoWork()にスローされた場合は、など

整数、文字列、オブジェクト/複合型を返すことができるので、あなたは、あなたがこれに好きなものを割り当てることができますErrorプロパティはRunWorkerCompletedEventArgsです。この状況では、ResultプロパティにアクセスするとTargetInvocationExceptionがスローされます。

+0

どうERROR' 'についてを使用してクラス?これはOPが求めていたものです。 –

+1

答えが更新されました。ありがとう。 (電話で読んで逃した) – SimonGoldstone

0

結果プロパティを使用して、DoWorkの結果を格納し、完了イベントからアクセスできます。しかし、バックグラウンドワーカープロセスがキャンセルされたり、例外が発生したりすると、結果にアクセスできなくなります。詳細はhereです。

その後、
5
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(); 
     } 
    } 
} 
関連する問題