C# 在BackgroundWorkerProgressChanged事件中更改数据行时发生VersionNotFoundException

C# 在BackgroundWorkerProgressChanged事件中更改数据行时发生VersionNotFoundException,c#,.net,datagridview,windows-applications,krypton-toolkit,C#,.net,Datagridview,Windows Applications,Krypton Toolkit,这行[“文件进度”]=e.ProgressPercentage下面的代码给出了版本NotFoundException的错误。请提供帮助,因为这会对应用程序造成严重破坏,同时我也面临着例外:很多次是随机的 BackgroundWorker ProgressChanged代码 private void bwTransferQueue_ProgressChanged(object sender, System.ComponentModel.ProgressChangedEventArgs e) {

行[“文件进度”]=e.ProgressPercentage下面的代码给出了
版本NotFoundException
的错误。请提供帮助,因为这会对应用程序造成严重破坏,同时我也面临着例外:很多次是随机的

BackgroundWorker ProgressChanged代码

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

您正在多个线程上修改
DataRow

BackgroundWorker
DoWork
事件在后台线程上引发。调用
ReportProgress
时,GUI线程上会引发
ProgressChanged
事件。这样做的原因是,您可以轻松地从ProgressChanged事件处理程序更新UI元素

这可能就是破坏
DataTable
索引的原因


至于
VersionNotFoundException
,我可以想象它在某种程度上与多线程访问/损坏有关,但我不确定。然而,我肯定会先看看你的线程是如何与
数据行

@Harsh.Baid进行交互的——这会消除你看到的症状,但不会纠正根本问题,你可能只是开始看到奇怪的问题,而不一定是异常。如果您打算继续使用一种设计,这意味着列表由多个线程更新,那么您可能需要使用某种同步。在进行任何更大的更改之前,每当我需要更新
DataRow
时,我可能会尝试锁定
dtTransferQueue
,看看这是否会有所不同。然而,正如您所知,线程是一个复杂的主题,我只能根据您的示例提供有限的建议。