2016-11-30 21 views
3

今天我遇到了一个奇怪的现象,我无法真正解释。在gridview中有一个包含多行的网页,需要将它们逐个保存到数据库和XML文件中。我最终使用了Parallel.ForEach,因为行之间没有关系,所以它们可以独立执行。该代码基本上是这样的:为什么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的文化与第二种情况不同,我没有丝毫的理由。

有什么建议吗?

+2

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

回答

4

这是因为您已经为设置了文化CurrentThreadParallel.ForEach将为每个迭代创建一个新的Task,它们将具有默认文化。

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

CultureInfo.DefaultThreadCurrentCulture on msdn

+0

谢谢你的回答!你是对的。不幸的是,这个应用程序仍然使用4.0,没有选择在下一个版本之前改变它。 我决定在循环内设置文化设置。不胜感激! – MeanGreen

+0

Your're welcome,正如你所说,你可以在循环内设置文化线程。 –

相关问题