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

时间:2016-11-30 19:18:47

标签: c# asp.net cultureinfo parallel.foreach

今天我遇到了一个我无法解释的奇怪现象。在gridview中有一个包含多个行的网页,需要将其逐个保存到数据库和XML文件中。我最终使用struct BaseWithVariable { int n {42}; }; struct BaseNoVariable {}; template <typename T> struct Base : std::conditional<std::is_same<T, int>::value, BaseWithVariable, BaseNoVariable>::type {}; ,因为行之间没有关系,所以它们可以独立执行。代码基本上是这样的:

Base<int> b {};
Base<double> d {};

std::cout << b.n << std::endl;
std::cout << d.n << std::endl; // error

为什么当我将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); } } 我没有更改时,此代码的工作方式会有所不同?

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

有什么建议吗?

1 个答案:

答案 0 :(得分:5)

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

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

CultureInfo.DefaultThreadCurrentCulture on msdn