0

以下のこのrow["FileProgress"] = e.ProgressPercentage;コードは のエラーを出していますVersionNotFoundException。アプリケーションに大混乱を引き起こしているため、助けてください。例外: DataTable 内部インデックスが破損しています: '5'が何度もランダムに発生します。

BackgroundWorker Progressコードの変更

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

1 に答える 1

0

DataRow複数のスレッドでを変更しています。

DoWorkイベントがBackgroundWorkerバックグラウンド スレッドで発生します。を呼び出すとReportProgressProgressChangedGUI スレッドでイベントが発生します。これは、ProgressChanged イベント ハンドラーから UI 要素を簡単に更新できるようにするためです。

DataTableこれが、インデックスを破損している理由である可能性があります。

についてはVersionNotFoundException、何らかの形でマルチスレッド アクセス/破損に関連していると想像できますが、確かなことはわかりません。ただし、スレッドがDataRow.

于 2011-08-10T11:34:06.780 に答える