我有一個數組,它是一個文件夾中的文件列表,我正在處理這些文件並對它們進行重命名。大約需要15分鐘重新命名它們,這是每天完成的。我目前有1個Backgroundworker來處理這個並更新UI。由多個backgroundworkers處理的單個任務?
我的問題是,如何使用多於1個Backgroundworker來使用超過25%的CPU來做到這一點?
將數組拆分爲3部分,然後調用3個獨立的工作人員來完成它們的工作?
我有一個數組,它是一個文件夾中的文件列表,我正在處理這些文件並對它們進行重命名。大約需要15分鐘重新命名它們,這是每天完成的。我目前有1個Backgroundworker來處理這個並更新UI。由多個backgroundworkers處理的單個任務?
我的問題是,如何使用多於1個Backgroundworker來使用超過25%的CPU來做到這一點?
將數組拆分爲3部分,然後調用3個獨立的工作人員來完成它們的工作?
如果你使用.NET 4.0,那麼你可以使用並行擴展,這將有效地爲你做這個 - 你只需要調用
Parallel.ForEach(files, file =>
{
// Call file processor here
});
注意,如果你的任務是嚴重IO綁定,使用多個線程可能會減慢速度而不是加快速度。
我的3.5應用程序,但沒有理由不能升級到4.0,我會研究,非常感謝你的意見。 – Landmine 2010-06-24 00:55:26
您可以在構造函數中創建一個接受文件夾路徑的工作類。該工作人員類負責重命名其初始化文件夾的上下文中的所有文件。這個類可以有一個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();
享受!
感謝Doug,但是,所有這些文件都在1個文件夾中......這是一個剛剛填充的上傳文件夾! – Landmine 2010-06-24 00:54:09
如果處理每個項目的時間幾乎沒有變化,那麼拆分數組並給每個工人一個部分可能沒問題。不過,您可能會發現整理清單並讓每位工作人員都說「給我一些工作要做」,這樣可以確保工作分配更均勻。對於更多變化的工人羣體也是有彈性的,工人可以在系統資源許可的情況下來來去去。
你幾乎在那裏回答你自己的問題。 – 2010-06-23 21:53:23
您也可以使用一個共享*併發安全*隊列,並讓每個工人從中拉出(直到它爲空,這是終止條件)。這是我通常使用的方法。 – 2010-06-23 22:03:31