2012-01-20 8 views
2

DB (MS Access)에서 데이터를로드하는 데 BackGround Worker를 사용하고 있습니다. 내의 Form_Load에서 은 내가 사용C#의 호출 대상에서 예외가 발생했습니다.

내 DoWork 이벤트에서
bgw.RunWorkerAsync(); 

나는 내가 DataGridView에 데이터를 할당 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; 


    } 

에서 그리고 내 RunWorkerCompleted의 데이터를 laod.

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 메커니즘.

System.Threading.SynchronizationContext synchronizationContext; 
  1. 가 Form_Load 이벤트의 오브젝트 "SynchronizationContext에"을 인스턴스화 : 글로벌 오브젝트로서 여기에 실시 예 http://www.codeproject.com/KB/threads/SynchronizationContext.aspx

    1 .Have이

    SynchronizationContext에 System.Threading.SynchronizationContext.Current =;

  2. 수정 bgw_RonWorkerCompleted에 : 당신은 크로스 스레드 작업을 할 수 있습니다

+0

@Razvan : 같은 오류 야 : – user662285

+0

e.Result를 Cells [0] .Value 유형으로 캐스팅하려고 했습니까? e.Result가 DataSet 객체입니다. 이렇게 할 수 있습니다. dgUsers.DataSource = e.Result를 DataSet으로 사용하십시오. –

+0

DataSet ds = e.결과를 DataSet으로; 시도해보십시오 { dgUsers.DataSource = ds; for (int iCounter = 0; iCounter user662285

2

다른 스레드에서 예외가 발생할 때 발생합니다. 내부 예외 예외가 DoWork 방법에 의해 throw 된 실제 예외를 찾을 수

확인 .. UI 업데이트

0

개인 무효 bgw_RunWorkerCompleted (개체를 보낸 사람, RunWorkerCompletedEventArgs 전자) {

 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에서 예외를 처리하지 마십시오.

private void bgw_DoWork(object sender, DoWorkEventArgs e) 
{ 
      OpenDB(); 
      e.Result = GetAllUserInfo(); 
} 

대신 UI 스레드에서 RunWorkerCompletedEventArgs의 Error 속성을 확인해야합니다.

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

} 
관련 문제