今天我遇到了一个我无法解释的奇怪现象。在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的文化与第二种情况不同,我没有丝毫的线索原因。
有什么建议吗?
答案 0 :(得分:5)
这是因为您为 CurrentThread 设置了文化。 Parallel.ForEach
会为每次迭代创建一个新的Task
,它们将拥有默认文化。
在.NET 4.5中,您可以使用CultureInfo.DefaultThreadCurrentCulture
属性来更改AppDomain
的文化(为所有线程设置区域性)。