FileSystemWatcher .Net 3.5

本文关键字:Net FileSystemWatcher | 更新日期: 2023-09-27 17:59:10

刚刚在Win服务上从.Net 1.1切换到3.5,运行了10年,处理了200多万个文件。我有一个异步类,它使用FileSystemWatcher事件处理程序将图形打印到PDFPrinter,现在它在自己的STA线程上,归档PDF文件。PDF创建是异步的,因为现有的客户端应用程序方法允许在DateTime间隔内创建所有丢失的PDF。

(1) 如果没有在STA线程上分离的事件处理程序,服务将挂起。

(2) 由于只有几个PDF在几秒钟内到达,所以它运行良好。将其增加到5个PDF,不可避免地会有一个文件无法存档。将其增加到15个PDF,其中一些不会存档(所有这些都在测试台中)。在移动文件之前,我会检查它是否存在,需要两次成功检测(PDF打印机往往会产生幻影文件创建事件)。我还检查对该文件的独占访问权限。更新:我在COM交互代码的不同部分尝试了另一种STA线程创建方法(通过参数化的类和方法),但也遇到了同样的不可靠性问题(只有大约50%的线程完成)。

对于PDF,我很想设置一个Timer来归档废弃的文件,但不清楚何时启动Timer,以避免多个Timer尝试执行相同的归档任务(这会带来Oracle并发问题的额外危险);这种设计感觉有点像皮带和吊带(负ugh因素)。

这是一个很常见的范例,要想变得健壮应该没那么难!寻求关于(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

FileSystemWatcher .Net 3.5

回答(2):我必须添加代码来线性化或重新同步新的STA线程与旧的MTA线程(例如,阻塞父线程,直到工作线程完成)。

thread.Join();

这在伪代码中的点(A)工作得很好,但在点(B)工作得不好,因为我有一些共享字段变量,这些变量仍然需要移动到线程参数中(不是所有PDF都被创建的潜在原因)

我承认,我仍然不理解为什么需要在STA线程上处理跨网络归档文件的FileSystemWatcher(问题(1))。