0

この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); 
    } 
} 

答えて

0

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

イベントは、BackgroundWorkerがバックグラウンドスレッドで発生します。 ReportProgressに電話すると、GUIスレッドでProgressChangedイベントが発生します。この理由は、ProgressChangedイベントハンドラからUI要素を簡単に更新できるようにするためです。

DataTableのインデックスが壊れている可能性があります。

VersionNotFoundExceptionについては、マルチスレッドアクセス/破損と何らかの関係があるとは思いますが、確かに分かりません。しかし、私はあなたのスレッドがDataRowとどのようにやりとりしているかを見ることから始めます。

+0

あなたが強く型付けされたリストを使用すればいいと思いますか?リスト

+0

@ Harsh.Baid - あなたが見ている症状を取り除きますが、必ずしも例外ではなく、奇妙な問題を見始めることがあります。リストを複数のスレッドで更新するという設計を続ける場合は、おそらく何らかの同期を使用する必要があります。私はおそらく 'dtTransferQueue'をロックすることを試みるでしょう。大きな変更を加える前に' DataRow'を更新する必要があるときは、違いがあるかどうかを確認してください。しかし、あなたが知っているスレッディングは複雑なトピックであり、私はあなたの例に基づいて限られたアドバイスしか提供できません。 –

関連する問題