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
回答(2):我必须添加代码来线性化或重新同步新的STA线程与旧的MTA线程(例如,阻塞父线程,直到工作线程完成)。
thread.Join();
这在伪代码中的点(A)工作得很好,但在点(B)工作得不好,因为我有一些共享字段变量,这些变量仍然需要移动到线程参数中(不是所有PDF都被创建的潜在原因)
我承认,我仍然不理解为什么需要在STA线程上处理跨网络归档文件的FileSystemWatcher(问题(1))。