2012-01-20 2 views
2

Я использую BackGround Worker для загрузки данных из базы данных (MS Access). В моей Form_Load я использую:Исключение было выбрано целью вызова в C#

bgw.RunWorkerAsync(); 

В моем случае я DoWork laod данные из БД

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 я присвоить данные в 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 механизм для обновления пользовательского интерфейса. Пример здесь http://www.codeproject.com/KB/threads/SynchronizationContext.aspx

1 Имейте это в качестве глобального объекта:

System.Threading.SynchronizationContext synchronizationContext; 
  1. экземпляр объекта "SynchronizationContext" на Form_Load событие:

    SynchronizationContext = System.Threading.SynchronizationContext.Current;

  2. Изменить bgw_RonWorkerCompleted на:

    частной ничтожной bgw_RunWorkerCompleted (объект отправителя, RunWorkerCompletedEventArgs е) {

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

    }

+0

@ Razvan: Same Error Dude :( – user662285

+0

Вы пытались наложить e.Result на ячейки [0]. Тип типа? Ваш e.Result - это объект DataSet. Вы можете сделать это dgUsers.DataSource = e.Result как DataSet –

+0

DataSet ds = e.Результат как DataSet; try { dgUsers.DataSource = ds; for (int iCounter = 0; iCounter user662285

2

Это происходит, когда исключение происходит в другом потоке.

Убедитесь, что исключения внутреннего исключения, чтобы найти реальное исключение, сброшенную вашего методом DoWork ..

0

Вы можете иметь операцию поперечного Тема: RunWorkerCompleted не поднимается в потоке пользовательского интерфейса, что приводит к операции поперечной резьбы на .Value. Не могли бы вы попробовать следующее:

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

вместо этого вы должны проверить ошибки Достояние RunWorkerCompletedEventArgs обратно в потоке пользовательского интерфейса.

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

} 
Смежные вопросы