【问题标题】:Why does Parallel.ForEach change the culture of its threads?为什么 Parallel.ForEach 会改变其线程的文化?
【发布时间】:2016-11-30 19:18:46
【问题描述】:

今天我遇到了一个我无法解释的奇怪现象。有一个网页在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);
                }
            }

为什么当我用旧的foreach 替换Parallel.ForEach 并且我什么都没改变时,这段代码的工作方式会有什么不同?

不同之处在于,在第一种情况下创建 XML 的文化与第二种情况不同,我一点也不知道为什么。

有什么建议吗?

【问题讨论】:

  • 文化可以存储为本地线程。如果您更改了活动线程的区域性,它不会影响线程池线程。

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


【解决方案1】:

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

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

(CultureInfo.DefaultThreadCurrentCulture on msdn)

【讨论】:

  • 感谢您的回答!你是对的。不幸的是,这个应用程序仍在使用 4.0,在下一个版本之前无法更改它。我决定在循环内设置文化设置。赞赏!
  • 不客气,正如你所说,你可以在循环内设置文化线程。
猜你喜欢
  • 1970-01-01
  • 2019-09-10
  • 1970-01-01
  • 2021-04-09
  • 1970-01-01
  • 1970-01-01
  • 2018-11-06
  • 1970-01-01
相关资源
最近更新 更多