2010-06-23 31 views
2

我有一個數組,它是一個文件夾中的文件列表,我正在處理這些文件並對它們進行重命名。大約需要15分鐘重新命名它們,這是每天完成的。我目前有1個Backgroundworker來處理這個並更新UI。由多個backgroundworkers處理的單個任務?

我的問題是,如何使用多於1個Backgroundworker來使用超過25%的CPU來做到這一點?

將數組拆分爲3部分,然後調用3個獨立的工作人員來完成它們的工作?

+0

你幾乎在那裏回答你自己的問題。 – 2010-06-23 21:53:23

+0

您也可以使用一個共享*併發安全*隊列,並讓每個工人從中拉出(直到它爲空,這是終止條件)。這是我通常使用的方法。 – 2010-06-23 22:03:31

回答

3

如果你使用.NET 4.0,那麼你可以使用並行擴展,這將有效地爲你做這個 - 你只需要調用

Parallel.ForEach(files, file => 
{ 
    // Call file processor here 
}); 

注意,如果你的任務是嚴重IO綁定,使用多個線程可能會減慢速度而不是加快速度。

+0

我的3.5應用程序,但沒有理由不能升級到4.0,我會研究,非常感謝你的意見。 – Landmine 2010-06-24 00:55:26

1

您可以在構造函數中創建一個接受文件夾路徑的工作類。該工作人員類負責重命名其初始化文件夾的上下文中的所有文件。這個類可以有一個DoWork()方法,你所有的重命名工作都會發生。這將允許您爲每個文件夾創建1個工人類,然後在單獨的線程上啓動每個工人類,從而將工作分開,無論您希望如何。將線程優先級設置得更高可以讓你在CPU上獲得更多時間。

System.Threading命名空間包含你所需要的。

public class worker 
{ 
    private string _folderPath = string.Empty; 

    public worker(string folderPath) 
    { 
    _folderPath = folderPath 
    } 

    public void DoWork() 
    { 
    //work happens here 
    } 
} 


worker fileWorker = new worker("path to file folder"); 
Thread newThread = new Thread(fileWorker.DoWork); 
newThred.Start(); 

享受!

+0

感謝Doug,但是,所有這些文件都在1個文件夾中......這是一個剛剛填充的上傳文件夾! – Landmine 2010-06-24 00:54:09

0

如果處理每個項目的時間幾乎沒有變化,那麼拆分數組並給每個工人一個部分可能沒問題。不過,您可能會發現整理清單並讓每位工作人員都說「給我一些工作要做」,這樣可以確保工作分配更均勻。對於更多變化的工人羣體也是有彈性的,工人可以在系統資源許可的情況下來來去去。