在Win服務處於活動狀態10年後,從.NET 1.1切換到3.5,處理超過200萬個文件。我有一個異步類,它使用FileSystemWatcher事件處理程序將圖形打印到PDFPrinter,現在在它自己的STA線程上歸檔PDF文件。由於現有客戶端應用程序方法允許以DateTime間隔創建所有缺少的PDF,所以PDF創建是異步的。FileSystemWatcher .Net 3.5
(1)如果事件處理程序在STA線程上分離,則服務將掛起。 (2)只有少數PDF在幾秒鐘內到達,它工作正常。將其增加到5個PDF文件,不可避免的是一個文件不會被歸檔。將其增加到15個PDF文件,其中一些文件不會被歸檔(所有這些都在測試平臺中)。在移動文件之前,我檢查它是否存在,需要2次成功檢測(PDF打印機傾向於生成幻像文件創建事件)。我也檢查文件的獨佔訪問權限。更新:我在COM交互代碼的不同部分中嘗試了另一個STA線程創建方法(通過參數化類和方法),並且具有與不可靠性相同的問題(只有大約50%的線程完成)。
對於PDFs,我很想設置一個定時器來歸檔放棄的文件,但我們不清楚何時啓動定時器,以避免多個定時器嘗試執行相同的歸檔任務(併發問題會帶來額外的危險) ;那種設計感覺有點像皮帶和吊帶(消極因素)。
這就是這樣一個常見的範例,它不應該很難做出健壯的!尋求啓發(1)並幫助使新的STA線程可靠完成(2)。
僞
Test bed user interface:
// Process 20 instrument raw data files in a loop
// For each file:
// 1-2 s to setup processing and retrieve metadata from database on each file
// (A) spin off STA worker thread
// call instrument vendor COM API to read data file
// setup FileSystemWatcher for PDF files
// create graphical image PDF
// handle PDF_Created in a shell that ...
// (B) spins off STA worker thread to
// archive the PDF
你可以分享最簡單的可複製代碼示例,所以我們有代碼來推理? – rene
我真的希望;我能做的最好的是僞代碼。儘管如此,我所寫的任何評論都是值得歡迎的。 – beanmf