簡體   English   中英

FileSystemWatcher觸發后 - 線程池還是專用線程?

[英]After FileSystemWatcher fires - Thread Pool or Dedicated thread?

我即將實現原型FileSystemWatcher解決方案。 我有一個目錄來監控文件創建,以及吸收創建的文件並將其插入數據庫的任務。 大致這將涉及讀取和處理6或7,80個字符文本文件,每隔幾秒發生一次150毫秒的爆發,很少還需要處理2MB二進制文件。 這很可能是一個24/7的過程。

從我讀到的有關FileSystemWatcher對象的內容來看,最好將其事件排入一個線程,然后在另一個線程中將它們出列/處理。 我現在遇到的困境是進行處理的線程的更好的創建機制。 我能看到的選擇是:

  1. 每次我收到FSW事件時,我都會手動創建一個新線程(是的,我知道......愚蠢的架構,但我必須說出來)。

  2. 每當我收到FSW事件時,都會在CLR線程池中拋出處理

  3. 在啟動時,為處理創建專用的第二個線程,並使用生產者/消費者模型來處理工作。 主線程將請求排隊,第二個線程將其排隊並執行工作。

我傾向於將第三種方法作為首選方法,因為我知道工作線程將始終是必需的 - 而且可能更多因為我對線程池沒有感覺。

第三種選擇是最合乎邏輯的。

關於FSW丟失一些文件事件,我實現了這個:1)在FileCreate上觸發的FSW對象2)tmrFileCheck,ticks = 5000(5秒) - 調用tmrFileChec_Tick

當FileCreate事件發生時,如果(tmrFileCheck.Enabled == false)則tmrFileCheck.Start()

這樣,10秒后tmrFileCheck_Tick會觸發a)tmrFileCheck.Stop()b)CheckForStragglerFiles

在我運行的測試中,這在每分鍾創建<100個文件的情況下有效。

一個變體是只有一個計時器滴答NN秒並掃描目錄(ies)為straggler文件。

另一個變種是雇用我按F5刷新窗口,並在存在straggler文件時給你打電話; 只是一個建議。 :-P

如果您知道將始終需要第二個線程,並且您也知道您將永遠不需要多個工作線程,那么選項三就足夠了。

請注意,FileSystemWatcher可能會錯過事件,但無法保證它會提供已發生的所有特定事件。 您將接收事件的線程完成的工作保持在最低限度的設計應該減少發生這種情況的可能性,但考慮到有限事件緩沖區大小(最高為64KB),它仍然是可能的。

如果您決定使用FileSystemWatcher,我強烈建議您開發一系列酷刑測試。

在我們的測試中,我們遇到網絡位置問題,更改InternalBufferSize沒有修復,但是當我們遇到這種情況時,我們也沒有收到錯誤事件通知。

因此,我們使用Directory.GetFiles開發了我們自己的輪詢機制,然后將返回文件的狀態與先前輪詢的狀態進行比較,確保我們始終具有准確的delta。

當然,這會帶來相當大的性能成本,這對您來說可能不夠好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM