2013-02-04 34 views
2

我需要編寫一個應用程序,將監測由第三方軟件創建新文件的特定文件夾,然後將它們一一複製到我的倉庫,並將它們發送, ,到一個Web服務。一旦文件發送,它將從回購中刪除。Queue實現文件監視,並將它們發送到Web服務

我顯然會使用FileSystemWatcher的文件監控,並將它們複製到我的回購協議。 然後,我會將複製的文件名排入隊列。

我應該在這裏做什麼? 如何在發送文件時管理此隊列和出隊? 另一個問題是如何使這個線程安全,因爲從不同的隊(FileSystemWatcher)訪問隊列?

什麼是實現這一目標的最佳和最安全的方式是什麼?

感謝您的答案, SkyFox

回答

1

在開始的時候:

BlockingCollection<string> q = new BlockingCollection<string>(); 
var bg = new BackgroundWorker(); 
bg.DoWork += (s,e) => SendFilesToServer(); 
bg.RunWorkerAsync(); 

在文件觀察器事件(創建的文件):

q.Add(fileName); 

的 '工人':

void SendFilesToServer() 
{ 
    string filename; 
    try 
    { 
     while(true) 
     { 
      while (q.TryTake(out fileName)) 
      { 
       // Send to the webservice 
      } 
      while(q.IsEmpty) 
       Thread.Sleep(100); 
     } 
    } 
    catch (InvalidOperationException) 
    { 
    } 
} 
+1

正是我需要Boppity波普,感謝這一點。 – user1307346

0

我不認爲你需要爲多個文件觀察家多個線程。 (也許我誤解了你的陳述。)另外,我不確定爲什麼你甚至需要一個隊列。

有你的應用程序主線程中運行該文件觀察者。隨着文件觀察器事件被觸發,您可以啓動工作線程來處理每個文件操作,以執行涉及的實際工作(每個文件一個線程)。線程操作彼此獨立,因此您不必擔心線程安全。觀察者應該處理文件系統通知事件的隔離,以便最終不會得到具有相同文件的兩個通知事件。

+0

謝謝回答彼得。 我的問題始於將文件逐個傳輸到Web服務。 這就是爲什麼我想排隊,堆積起來(轉移很慢)。 但這裏是問題: 我可能有幾個文件已經排隊,更多來自文件觀察器,有些在上傳後從隊列中刪除。 我應該如何管理這個邏輯? – user1307346

相關問題