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
,看看这是否会有所不同。然而,正如您所知,线程是一个复杂的主题,我只能根据您的示例提供有限的建议。