为什么Parallel.ForEach改变了它的线程文化?

Mea*_*een 4 c# asp.net cultureinfo parallel.foreach

今天我遇到了一个我无法解释的奇怪现象.在gridview中有一个包含多个行的网页,需要将其逐个保存到数据库和XML文件中.我最终使用了一个Parallel.ForEach,因为行之间没有关系,所以它们可以独立执行.代码基本上是这样的:

        Parallel.ForEach(gvWithData.Rows.Cast<GridViewRow>(), row =>
        {
            if (row.RowType == DataControlRowType.DataRow)
            {
                    // do some logic and stuff...
                    var type = new Object { ... };

                    // save to the database
                    type.Save();

                    // retrieve the saved item from the database again
                    //  since we need some autoincrement values from the db
                    var typeAfterSave = TypeManager.GetFromDb();

                    // create a custom XML from the object
                    XmlManager.CreateXml(typeAfterSave);
                }
            }
Run Code Online (Sandbox Code Playgroud)

为什么这个代码在我Parallel.ForEach用一个好老的替换时会有任何不同之处,foreach我什么都不做呢?

不同之处在于,在第一种情况下创建XML的文化与第二种情况不同,我没有丝毫的线索.

有什么建议?

Ali*_*ami 6

这是因为你为CurrentThread设置了文化.Parallel.ForEach将为Task每次迭代创建一个新的,它们将具有默认文化.

在.NET 4.5中,您可以使用该CultureInfo.DefaultThreadCurrentCulture属性来更改文化AppDomain(为所有线程设置文化).

(msdn上的CultureInfo.DefaultThreadCurrentCulture)