2012-01-20 4 views
2

DB(MS Access)からデータを読み込むためにBackGround Workerを使用しています。私が使用して私のForm_Loadで :私DoWorkイベントでC#での呼び出しの対象によって例外がスローされました

bgw.RunWorkerAsync(); 

私はDB

private void bgw_DoWork(object sender, DoWorkEventArgs e) 
    { 

     int iResult = OpenDB(); 
     if (iResult != 0) 
     { 
      MessageBox.Show("Error in Opening DataBase", Constants.TITLE); 
      return ; 
     } 
     DataSet ds = GetAllUserInfo(); 
     e.Result = ds; 


    } 

からデータをLAODそして私のRunWorkerCompletedに私はDataGridViewのにデータを割り当てます。

private void bgw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    { 

     dgUsers.Rows[0].Cells[0].Value = e.Result; 


    } 

//エラーがすべてのヘルプは高く評価されているコード

[STAThread] 
     static void Main() 
     { 
      Application.Run(new frmMain()); 
     } 

上で実行した後、ここに来ます。おかげさまで

+0

「上記のエラー」とは正確には何か。すべての例外(完全なスタックトレースを含む)? –

答えて

1

使用SyncronizationContextメカニズム。 ;

のSynchronizationContext = System.Threading.SynchronizationContext.Current:

System.Threading.SynchronizationContext synchronizationContext; 
  1. Form_Loadイベントにオブジェクト "のSynchronizationContext" をインスタンス化:ここでhttp://www.codeproject.com/KB/threads/SynchronizationContext.aspx

    1 .Haveこのグローバルオブジェクトとして実施例

  2. 変更bgw_RonWorkerCompletedに:あなたは、クロススレッド動作を有していてもよい

+0

@Razvan:同じエラーDude :( – user662285

+0

e.ResultをCells [0] .Valueタイプにキャストしようとしましたか?e.ResultがDataSetオブジェクトです。これはデータセットとしてdgUsers.DataSource = e.Resultを実行できます –

+0

DataSet ds = e。データセットとしての結果。 try { dgUsers.DataSource = ds; for(int iCounter = 0; iCounter user662285

2

これは、別のスレッドで例外が発生した場合に発生します。内部例外の例外は、あなたのDoWorkメソッドによってスローされた実際の例外を見つけるため

チェック.. UIの更新のための

0

プライベートボイドbgw_RunWorkerCompleted(オブジェクト送信者、RunWorkerCompletedEventArgs E) {

 synchronizationContext.Post(new SendOrPostCallback(
     delegate 
     { 
      dgUsers.DatSource =e.Result as DataSet; 
     }), null); 

}。 RunWorkerCompletedはUIスレッドでは発生せず、でクロススレッド操作が行われます。これを試すことができますか:

    private void bgw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
       { 
        if (this.InvokeRequired) 
        { 
         this.Invoke(bgw_RunWorkerCompleted, sender, e); 
         return; 
        } 
        dgUsers.Rows[0].Cells[0].Value = e.Result; 
       } 
1

bgw_DoWorkで例外を処理しないでください。

代わりに、RunWorkerCompletedEventArgsのErrorプロパティをUIスレッドで確認する必要があります。

private void bgw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    if (e.Error ==null) 
     dgUsers.Rows[0].Cells[0].Value = e.Result; 
    else 
     MessageBox.Show("Error in Opening DataBase", Constants.TITLE); 

}