2015-10-26 43 views
0

我正在編寫一個程序來查找特定文件夾中的所有重複文件。多線程能夠停止/暫停/繼續

我的想法是收集所有文件名到string[]。然後運行多個線程來散列每個字符串[]元素文件(按內容散列)並檢查散列是否已經在字典中查找重複項。

我初始化我的啓動按鈕搜索:

//Start button: 
    private void btnStart_Click(object sender, EventArgs e) 
    { 
      Search.initialize(this.labelPath.Text, this.textResultsFile.Text); 
    } 

    //My run method 
    public void run(string basePath, string resultFile) 
    { 
     //string[] contains all file paths 
     string[] filePaths = Directory.GetFiles(@basePath, "*", SearchOption.AllDirectories); 

     HashingCompletedCallback callback = new HashingCompletedCallback(CheckDuplicate); 
     Multi multi = new Multi(string[0], callback); 
     Thread T1 = new Thread(new ThreadStart(multi.HashFile)); 
     T1.Start(); 
    } 

因此,在這種情況下,我服用string[0],這是在路徑列表(例如:C:/BasePath/first.txt')第1條路徑,散列文件,並在callback如果哈希檢查存在如果字典,如果是的話,找到重複,否則我只是添加哈希庫。

因此,這裏有我面對現在存在一些問題:

  1. 如何實現這樣的搜索停止/繼續和重啓?我已經使用Windows.Forms創建了這些按鈕,但我不確定如何控制它們,並且不會因用戶界面鎖定而失敗。例如,如果我啓動foreachstring[] as element - >我的用戶界面凍結,無法執行任何操作。

  2. 目前我寫了我的程序,所以我可以使用一個工作線程。我如何自動創建更多的線程並將其引入搜索?在這種情況下,我想我必須將鎖放入回調函數中,所以我的字典一次只能由一個線程檢查和寫入。在這可以我只是鎖定我的方法功能或整個班級將被鎖定?

順便說一句:我沒有讀到:how to pause/resume a thread,但不知道如何使用它。

+0

什麼是C++連接?這是標題中的拼寫錯誤嗎? – spender

+0

類型。一段時間之前一直在做C++。 – Dancia

+0

NP。順便說一句:沒有必要在標題中加標籤。您已經標記了這個C#,所以不需要在標題 – spender

回答

1

如何在此類搜索中實現停止/繼續和重新啓動按鈕?

您可以使用ManualResetEvent讓您的UI線程控制工作線程是運行還是暫停。在處理下一個文件之前,工作線程會分別調用WaitOne。

A ManualResetEvent的功能就像一個普通的門。調用Set打開門,允許任意數量的線程調用WaitOne來讓其通過。調用重置關閉門。在關閉的門上調用WaitOne的線程將被阻塞;當大門下一次打開時,它們將一次全部釋放。

Source

目前,我已經寫了我的計劃,所以我可以用一個工作者線程。我如何自動創建更多的線程並將其引入搜索?在這種情況下,我想我必須將鎖放入回調函數中,所以我的字典一次只能由一個線程檢查和寫入。

考慮一個ConcurrentDictionary而不是字典,因爲它被設計爲線程安全的。

這些天我會使用一個任務,而不是一個線程。假設你堅持一個線程,你可以做類似的事情。

Thread T1 = new Thread(new ThreadStart(multi.HashFile)); 
T1.Start(); 
// Repeat for T2, T3, etc as desired. 
T1.Join(); 
// Repeat for T2, T3, etc. 
+0

這是規定。我一半我週末的時間研究這個東西一點點C#項目中,我有玩,而這正是我建議這個問題。 – user5151179