0

我最近优化了我的函数,该函数使用 Parallel For 循环将一些值插入到 excel 工作簿中(我必须在循环中比较大约 500000 个值)。如果我使用简单的 for 循环,一切对我来说都很好,但是如果我开始使用 Parallel For 语句,我没有错误并且代码工作正常,但是在 excel 工作簿中插入的值不像预期的那样(在不同的行中,不像我使用简单的 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());

                        }

                    }


                });

我正在使用 List 数组,并且我在某处读到 List 泛型不是线程安全的,这可能会让我遇到麻烦。如果是这样,您能建议我使用哪种动态数组以及如何在插入前锁定。谢谢..

4

1 回答 1

4

就像我回忆的那样。在这里阅读:http: //msdn.microsoft.com/en-us/library/8sesy69e.aspx

TL;博士

Office 对象模型不是线程安全的。您可以在某些情况下使用多个线程,但是 COM 服务器会为您序列化调用。

在这里使用 Paraller.For 无法获得任何好处。

于 2012-12-25T18:05:31.010 回答