VersionNotFoundException при изменении DataRow в событии BackgroundWorkerProgressChanged - PullRequest
0 голосов
/ 10 августа 2011

Этот код row["FileProgress"] = e.ProgressPercentage; ниже дает ошибку VersionNotFoundException.Пожалуйста, помогите, потому что это создает хаос для приложения, также я столкнулся с исключением: Внутренний индекс DataTable поврежден: '5' много раз случайно.

BackgroundWorker ProgressChanged code

private void bwTransferQueue_ProgressChanged(object sender, System.ComponentModel.ProgressChangedEventArgs e)
{
    DataRow row = e.UserState as DataRow;
    if (row != null)
    {
        row["FileProgress"] = e.ProgressPercentage;     <--- VersionNotFoundException
    }
}

BackgroundWorker DoWork код

private void bwTransferQueue_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
{
    DataRow row = e.Argument as DataRow;
    try
    {
        if (row != null)
        {
             // some code
             bwTransferQueue.ReportProgress(0, row);
        }
    }
    catch (WebException webex)
    {
        row["Status"] = QueueType.Failed;
        row["StatusDescription"] = webex.Status;
        e.Result = row;
    }
    catch (Exception ex)
    {
        row["Status"] = QueueType.Failed;
        row["StatusDescription"] = ex.Message;
        e.Result = row;
    }
}

Код для запуска фонового работника

private void startWorker()
{
    try
    {
         if (StartQueue && dtTransferQueue.Rows.Count > 0 && !bwTransferQueue.IsBusy)
         {
              DataRow[] rows = dtTransferQueue.Select(string.Format("Status = '{0}'", QueueType.Pending.ToString()));
              if (rows.Length > 0)
              {
                  tsmiProgressBar.Visible = true;
                  bwTransferQueue.RunWorkerAsync(rows[0]);
              }
         }
    }
    catch (Exception ex)
    {
          CommonLogic.HandleError(ex);
    }
}

1 Ответ

0 голосов
/ 10 августа 2011

Вы изменяете DataRow в более чем одном потоке.

Событие DoWork BackgroundWorker возникает в фоновом потоке.Когда вы вызываете ReportProgress, в потоке GUI возникает событие ProgressChanged.Причина этого в том, что вы можете легко обновить элементы пользовательского интерфейса из обработчика событий ProgressChanged.

Возможно, именно поэтому вы повреждаете индекс DataTable.

Что касается VersionNotFoundException Я могу представить, что это как-то связано с многопоточным доступом / повреждением, но точно не знаю.Однако я бы определенно начал с рассмотрения того, как ваши потоки взаимодействуют с DataRow.

...