0

最近、Parallel For ループを使用して Excel ワークブックにいくつかの値を挿入する関数を最適化しました (ループ内で約 500000 の値を比較する必要があります)。単純な for ループを使用するとすべてがうまく機能しますが、Parallel For ステートメントを使用し始めると、間違いはなく、コードは正常に動作しますが、値が Excel ワークブックに期待どおりに挿入されません (別の行で、i の場合とは異なります)。単純な for ループを使用します)。

これは私のコード サンプルです。解決策を見つけるために、助けていただけますか。

Parallel.For(0, DestinationListIDArray.Count, (int i) =>
                {
                    for (int j = 0; j < SourceListIDArray.Count; j++)
                    {
                        if (DestinationListIDArray[i].ToString() == SourceListIDArray[j].ToString() && DestinationListIDArray[i].ToString() != "НД")
                        {
                            int c = 1;
                            int summ = i + c;
                            string forB = summ.ToString();
                            string forC = summ.ToString();
                            DestrangeH = myExcelWorksheetDestination.get_Range(TEXTBOX_FIO_DESTINATION.Text + forB);
                            DestrangeI = myExcelWorksheetDestination.get_Range(TEXTBOX_DEST_DOLZHNOST.Text + forC);


                            DestrangeH.Interior.Color = System.Drawing.ColorTranslator.ToOle(COLORDIALOG_INF1_BACKGROUNDCOLOR.Color);
                            DestrangeH.Font.Color = System.Drawing.ColorTranslator.ToOle(COLORDIALOG_INF1_FOREGROUNDCOLOR.Color);
                            DestrangeI.Interior.Color = System.Drawing.ColorTranslator.ToOle(COLORDIALOG_INF2_BACKGROUNDCOLOR.Color);
                            DestrangeI.Font.Color = System.Drawing.ColorTranslator.ToOle(COLORDIALOG_INF2_FOREGROUNDCOLOR.Color);

                            //DestrangeH.set_Value(Missing.Value, SourceArray[j - 2].ToString());
                            //DestrangeI.set_Value(Missing.Value, SourceArray[j - 1].ToString());

                            DestrangeH.set_Value(Missing.Value, SourceListFIOArray[j].ToString());
                            DestrangeI.set_Value(Missing.Value, SourceListDolzhArray[j].ToString());

                        }

                    }


                });

私はリスト配列を使用していますが、リストジェネリックはスレッドセーフではないことをどこかで読みました。問題が発生する可能性があります。もしそうなら、どの種類の動的配列を使用するか、挿入前にロックする方法を教えてください。ありがとう..

4

1 に答える 1

4

思い出した通りです。ここを読む: http://msdn.microsoft.com/en-us/library/8sesy69e.aspx

TL;DR

Office オブジェクト モデルはスレッドセーフではありません。特定のシナリオでは複数のスレッドを使用できますが、COM サーバーが呼び出しをシリアル化します。

ここで Paraller.For を使用しても何も得られません。

于 2012-12-25T18:05:31.010 に答える