为什么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 )