为什么 Parallel.ForEach 会改变其线程的文化?

Why does Parallel.ForEach change the culture of its threads?

今天我遇到了一个我无法解释的奇怪现象。有一个网页,在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);
                }
            }

当我将 Parallel.ForEach 替换为旧的 foreach 并且 我什么都不做更改时,为什么这段代码会有所不同

不同的是,第一种情况下XML产生的文化与第二种情况不同,我一点也不知道为什么。

有什么建议吗?

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

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

(CultureInfo.DefaultThreadCurrentCulture on msdn)