为什么 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
的文化(为所有线程设置文化)。
今天我遇到了一个我无法解释的奇怪现象。有一个网页,在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
的文化(为所有线程设置文化)。