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

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

  Parallel.ForEach(gvWithData.Rows.Cast(), 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); } } 

当我用一个好的旧foreach替换Parallel.ForEach并且我没有改变别的东西时,为什么这个代码会有任何不同呢?

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

有什么建议?

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

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

( msdn上的CultureInfo.DefaultThreadCurrentCulture )