このrow["FileProgress"] = e.ProgressPercentage;
コードはVersionNotFoundException
のエラーを示しています。アプリケーションへの作成の混乱、また私は例外:DataTable internal index is corrupted: '5'ランダムに何度も直面しているので、助けてください。VersionNotFoundExceptionがBackgroundWorkerProgressChangedイベントでDataRowを変更するとき
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
}
}
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);
}
}
あなたが強く型付けされたリストを使用すればいいと思いますか?リスト –
@ Harsh.Baid - あなたが見ている症状を取り除きますが、必ずしも例外ではなく、奇妙な問題を見始めることがあります。リストを複数のスレッドで更新するという設計を続ける場合は、おそらく何らかの同期を使用する必要があります。私はおそらく 'dtTransferQueue'をロックすることを試みるでしょう。大きな変更を加える前に' DataRow'を更新する必要があるときは、違いがあるかどうかを確認してください。しかし、あなたが知っているスレッディングは複雑なトピックであり、私はあなたの例に基づいて限られたアドバイスしか提供できません。 –