2011-10-28 24 views
4

我開發了一個.net應用程序,使用.net framework 4.0,我已經使用parallel.for()循環進行多線程。我已經使用了以下配置:Parallel.for()循環創建錯誤的線程ID

  1. Windows 7的
  2. IIS 7.0
  3. 框架v4.0.30319

我用ParallelOptions()和這個類的 「MaxDegreeOfParallelism」 屬性設置爲5.我在日誌文件中記錄了「Thread.CurrentThread.ManagedThreadId」,以檢查是否在運行時創建了5個線程。我在兩種不同的環境中測試了這個應用程序。當應用程序在開發環境中運行時,它將創建5個線程ID。但是,當它在其他環境中運行時,它將創建6或7個線程ID。該應用程序僅在第一個環境中編譯。我已經使用發佈的應用程序版本在第二個環境中進行測試。 任何人都可以通過告知爲什麼會發生這種情況以及如何解決它來幫助我嗎?

回答

4

Parallel.For使用線程池中的線程。 MaxDegreeOfParallelism控制正在使用的線程的最大數量,而不是5個特定的線程 - 線程池可以自由地處理任何線程上的工作,而Parallel.For確保只有5個正在同時運行。

2

我相信這是因爲Parallel.For()使用在陣列以便通過動態分區可以在即時進行分區,並且每個分區由一個獨立的任務/線程處理:

  1. MSDN: How to: Implement Dynamic Partitions

    每次分區在枚舉器上調用MoveNext時,枚舉器 都會爲該分區提供一個列表元素。對於PLINQ和 ForEach,分區是Task實例。因爲在多個線程上同時發生請求 ,所以同步訪問當前的 索引。

    (I相信同樣如此Parallel.For()

  2. MSDN: Custom Partitioners

    PLINQ支持分區的一個固定數目(儘管數據可以是 在運行時動態地重新分配到這些分區爲加載 平衡)。 For和ForEach僅支持動態分區,其中 表示分區數在運行時發生更改。有關更多 信息,請參閱PLINQ和TPL的自定義分區程序。