(画像から) ピクセル値リーダーを最適化しようとしており、Parallel.For をバックグラウンド ワーカーと共に使用してバーに進行状況を表示しようとしました。ディクショナリを使用して、他の処理に使用する読み取り値を保存しています。Parallel.For のみを使用すると、完璧に動作し、時間は分以下になります。バックグラウンド ワーカーと Parallel.For を使用すると、辞書に値を追加しようとした時点で null 例外メッセージが表示されます。
C# .Net 4 を使用しています。
public Dictionary<string, DNValuesSrcTrgt> ReadPixelValuesFromImages(
string _trgtRasterName,
string _trgtRasterDirectory,
string _srcRasterName,
string _srcRasterDirectory
)
{
Dictionary<string, DNValuesSrcTrgt> dictSrcTrgtImgValue = null;
IRaster2 trgtRasterData2 = null;
IRaster2 srcRasterData2 = null;
try
{
//Open both the target and source images are IRaster2 QI
trgtRasterData2 = OpenIRaster2(_trgtRasterName, _trgtRasterDirectory);
if (trgtRasterData2 == null)
{
return null;
}
srcRasterData2 = OpenIRaster2(_srcRasterName, _srcRasterDirectory);
if (srcRasterData2 == null)
{
return null;
}
dictSrcTrgtImgValue = new Dictionary<string, DNValuesSrcTrgt>();
//Create a Raster Layer class to get the Number of columns and rows
//This is read from the target Raster Image
IRasterLayer trgtRasterLyr = new RasterLayerClass();
trgtRasterLyr.CreateFromDataset(trgtRasterData2.RasterDataset);
//Loop through all the rows and column for Target Image and get the
//Cell value and the X and Y value
//Then use the X and Y value to get the Cell value from Source Image
double xCord = 0.0;
double yCord = 0.0;
object valTrgt = null;
object valSrc = null;
int cnt = 0;
string errorMessage = string.Empty;
int i = 0;
Parallel.For(0, trgtRasterLyr.ColumnCount, (j, loopstate) =>
{
//if (UserAborted) return;
for (int k = 0; k < trgtRasterLyr.RowCount; k++)
{
DNValuesSrcTrgt srcTrgtImgValue = new DNValuesSrcTrgt();
cnt++;
srcTrgtImgValue.columnID = j;
srcTrgtImgValue.rowID = k;
valTrgt = trgtRasterData2.GetPixelValue(i, j, k);
//Math.Round(Convert.ToDouble(val1), 5);
trgtRasterData2.PixelToMap(j, k, out xCord, out yCord);
int colSrc = srcRasterData2.ToPixelColumn(xCord);
int rowSrc = srcRasterData2.ToPixelRow(yCord);
valSrc = srcRasterData2.GetPixelValue(i, colSrc, rowSrc);
srcTrgtImgValue.xCord = xCord;
srcTrgtImgValue.yCord = yCord;
srcTrgtImgValue.DNImageTrgt = Math.Round(Convert.ToDouble(valTrgt), 5);
srcTrgtImgValue.DNImageSrc = Math.Round(Convert.ToDouble(valSrc), 5);
//**This is where Error is Occuring**
dictSrcTrgtImgValue.Add(j.ToString() + "," + k.ToString(), srcTrgtImgValue);
valTrgt = null;
valSrc = null;
}
});
}
catch (Exception ex)
{
dictSrcTrgtImgValue = null;
System.Diagnostics.Debug.WriteLine(ex.Message);
return null;
}
finally
{
GC.Collect();
}
return dictSrcTrgtImgValue;
}