0

(画像から) ピクセル値リーダーを最適化しようとしており、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;
    }
4

1 に答える 1

0

辞書宣言をこれに置き換えるだけです。

public ConcurrentDictionary<string, DNValuesSrcTrgt> ReadPixelValuesFromImages(
                                            string _trgtRasterName, 
                                            string _trgtRasterDirectory,
                                            string _srcRasterName, 
                                            string _srcRasterDirectory
                                            )

ConcurrentDictionary<string, DNValuesSrcTrgt> concurrentdictSrcTrgtImgValue = null;

これは、同じ DataStructure(Parallel.For の) タスク並列ライブラリから引き出された複数のマネージ スレッドを使用している場合に、より意味があります。

于 2016-03-15T04:55:49.233 に答える