2012-01-18 9 views
1

私はいくつかの本当に簡単なコードを手に入れましたが、うまく動作しません。私はBackgroundWorkerを使用しています。問題は、RunWorkerCompletedが高速化する方法です。すぐに実行した後、私は "作業完了"というメッセージが表示されますが、アプリケーションは数秒間、 'DataType data = new DataType(path);' beignが実行されます。その後、すべてのDataGridViewsなどが正しく埋め込まれています。この1行をThread.Sleepと入れ替えると、すべてうまくいくようです。何か案は?あなたが方法を入力して終了しているときに表示するためにタイマーをDebug.Writeの代わりに、MessageBox.Showを使用する方法についてRunWorkerCompleted too too firing too

public frmWindow(string path) 
    { 
     InitializeComponent(); 
     DataType d; 
     backgroundWorker1.RunWorkerAsync(path); 
    } 

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
    { 
     string path = e.Argument as string; 
     DataType data = new DataType(path); 
     e.Result = data;    
    } 

    private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    { 
     d = e.Result as DataType; 
     MessageBox.Show("Work completed"); 
    } 
+0

どの時点でUIを更新していますか?コードから明らかではありません。アプリがUIスレッドにぶら下がっている可能性がある場合(例:おそらくバックグラウンドワーカーの外で実行されているグリッドビューにその部分が埋め込まれます。 – RobJohnson

+0

あなたはRunWorkerCompletedについて話しているときにDoWorkの行を指摘していますか? – BrokenGlass

+1

'その後、私はすべてのDataGridViewsなどが正しく埋め込まれています。したがって、グリッドを塗りつぶすにはDoWork()メソッドではなく時間がかかります。 –

答えて

1

このバックグラウンドスレッドがUI上で動作する可能性はありますが、UIはスレッドセーフではありません。

BackgroundWorker backGroundWorker1; 
     public frmWindow(string path) 
     { 
      InitializeComponent(); 
      DataType d; 

      backGroundWorker1 = new BackgroundWorker(); 

      backGroundWorker1.DoWork += (s, e) => 
      { 
       System.Diagnostics.Debug.Write("Work started at: " + DateTime.Now + Environment.NewLine); 
       string path = e.Argument as string; 
       DataType data = new DataType(path); 
       e.Result = data; 
      }; 

      backGroundWorker1.RunWorkerCompleted += (s, e) => 
      { 
       d = e.Result as DataType; 
       System.Diagnostics.Debug.Write("Work completed at: " + DateTime.Now + Environment.NewLine); 
      }; 

      backGroundWorker1.RunWorkerAsync(); 

     }