バックグラウンドワーカーでUltragridrowセルを更新しようとしていますが、これが1回以上呼び出されたときにInvalidOperation例外がスローされています。バックグラウンドワーカースレッドで値のセルを変更しようとしています
ここで、RunWorkerAsyncを開始するメソッドがあります。
private void RefreshGridCacheStart()
{
try
{
if (this.uGridCache.Rows.Count == 0)
{
return;
}
if(!workerThread.IsBusy)
{
workerThread.DoWork += LookUpHostnames;
workerThread.ProgressChanged += UpdateCacheHostCell;
workerThread.RunWorkerCompleted += WorkerCompleted;
workerThread.WorkerReportsProgress = true;
workerThread.RunWorkerAsync();
}
}
catch (Exception ex)
{
Debug.WriteLine(ex.Message + "\n" + ex.Source + "\n" + ex.ToString());
}
}
これは、DoWork方法である:
private void LookUpHostnames(object sender, DoWorkEventArgs e)
{
var rowValues = new object[2];
try
{
foreach (UltraGridRow row in uGridCache.Rows)//here is were I get an invalid operation exception
{
string cellValue = row.Cells["Host"].Text;
if (Globals.cNet.isValidIP(cellValue))
{
rowValues[0] = row;
rowValues[1] = cellValue;
workerThread.ReportProgress(0, rowValues);
string resolvedHostname = Globals.cIPLookup.LookupHostFromIP(cellValue);
rowValues[1] = resolvedHostname;
workerThread.ReportProgress(0, rowValues);
}
}
}
catch (Exception ex)
{
Debug.WriteLine(ex.Message + "\n" + ex.Source + "\n" + ex.ToString());
}
}
そして、これは報告書進捗メソッドです:
private void UpdateCacheHostCell(object sender, ProgressChangedEventArgs e)
{
var rowValues = e.UserState as object[];
var row = (UltraGridRow) rowValues[0];
var sMesage = (string) rowValues[1];
row.Cells["Host"].Value = sMesage;
}
で変化しているDoWorkメソッドで任意のコードがありませんアイテムを追加または削除してコレクションを並べ替えます。 DoWorkが別のスレッドで発生し、コレクションが例外の原因である場合はそのコレクションが別の場所で変更されるため、問題が発生する可能性が高くなります。 – alhalama
http://msdn.microsoft.com/en-us/library/system.collections.ienumerator.aspx「コレクションが変更されない限り、列挙子は有効なままです。コレクションの変更(たとえば、既存のアイテムを変更するとコレクションが無効になり、そのコードはUpdateCacheHostCellのコードとまったく同じです – Eddy
UltraGridRowオブジェクトの同じインスタンスが前後にあるため、コードはコレクションを変更していませんコードが実行されます。 InvalidOperationExceptionをスローするには、コレクション内の項目のインスタンスを追加、削除、または変更する必要があります。リスト内のオブジェクトによって公開されているプロパティの値を変更しても、この例外は発生せず、コードで実行されていることになります。 – alhalama