2016-11-30 56 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,正如你所說,你可以在循環內設置文化線程。 –

相關問題