刚刚从 .Net 1.1 切换到 3.5 的 Win 服务活跃了 10 年,处理了超过 200 万个文件。我有一个异步类,它使用 FileSystemWatcher 事件处理程序将图形打印到 PDFPrinter,现在在它自己的 STA 线程上,归档 PDF 文件。PDF 创建是异步的,因为现有的客户端应用程序方法允许在 DateTime 间隔内创建所有丢失的 PDF。
(1) 如果没有在 STA 线程上分离事件处理程序,服务就会挂起。
(2) 在几秒钟的间隔内只有几个 PDF 到达,它工作正常。将其增加到 5 个 PDF,不可避免地会有一个文件无法存档。将其增加到 15 个 PDF,并且有几个不会存档(所有这些都在测试台中)。在移动文件之前,我检查它是否存在,需要 2 次成功检测(PDFPrinters 往往会产生幻像文件创建事件)。我还检查对文件的独占访问权限。更新:我在 COM 交互代码的不同部分尝试了另一种 STA 线程创建方法(通过参数化的类和方法),并且遇到了同样的不可靠性问题(仅完成了大约 50% 的线程)。
对于 PDF,我很想设置一个 Timer 来归档废弃文件,但不清楚何时启动 Timer 以避免多个 Timer 尝试执行相同的归档任务(存在 Oracle 并发问题的额外危险);这种设计感觉有点像腰带和吊带(负面因素)。
这是一个如此普遍的范例,要变得健壮应该不难!寻找关于 (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