2011-10-27 3 views
4

多くのGUI操作を行うバックグラウンドワーカーがいますが、私の問題はそれらのオブジェクトがすべて(私が知っているように)メインスレッドにあり、常にすべてを呼び出す必要があることです私のコードを長くして読みにくくするものです。
1)これらのGUI要素を呼び出すジェネリックメソッドをどのように作成すればよいか知っていますか?
2)もっと簡単な方法がありますか?背景作業者の代理人と呼び出し者

ありがとうございます。

+1

これは間違っているだけなので、Begin/InvokeをBGWスレッドで使用する必要はありません。 ProgressChangedイベントとRunWorkerCompletedイベントはこれを行うためのものです。作業者のデータ生成のみに焦点を当てます。イベントハンドラ内のそのデータでUIを更新します。 –

+0

@HansPassant、どうすればデータを渡すことができますか? – funerr

答えて

3

BackgroundWorkerを使用すると、ReportProgressを入力し、パーセンテージの完成とオブジェクトを渡すことができます。 UIに渡すデータを含むクラスを作成し、それをオブジェクトとして渡すことができます。

ProgressChangedイベントは、UIスレッドで実行されているUIオブジェクトを操作できます。あなたの問題のため

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

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
    { 
     List<string> items = new List<string>(); 

     items.Add("Starting"); 
     System.Threading.Thread.Sleep(2500); 
     backgroundWorker1.ReportProgress(25, items.ToArray()); 

     items.Add("Halfway there"); 
     System.Threading.Thread.Sleep(2500); 
     backgroundWorker1.ReportProgress(50, items.ToArray()); 

     items.Add("Almost there"); 
     System.Threading.Thread.Sleep(2500); 
     backgroundWorker1.ReportProgress(75, items.ToArray()); 

     items.Add("Done"); 
     System.Threading.Thread.Sleep(2500); 
     backgroundWorker1.ReportProgress(100, items.ToArray()); 
    } 

    private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) 
    { 
     listBox1.Items.Clear(); 
     listBox1.Items.AddRange((string [])e.UserState); 
     this.Text = e.ProgressPercentage.ToString(); 
    } 

ReportProgressで二番目の引数はObject型です。あなたはあなたが望むものをそれに入れて、反対側の適切なタイプにキャストすることができます。

+0

例をありがとう、しかし私はProgressChangedに生成されたデータを送信する必要があります、私は今データを保持する配列を持っているが、私はそれを渡す方法を知らない+私は進捗率を変更したくない。 – funerr

+0

は、ReportProgressの2番目の引数として配列を渡します。これは、ProgressChangedイベントでUserStateにマッピングされます。 UserStateを配列にキャストします。 –

+0

UserState変数を使用して配列を渡す方法を示すために更新されました。 –

関連する問題