FileSystemWatcher .Net 3.5
Posted
技术标签:
【中文标题】FileSystemWatcher .Net 3.5【英文标题】: 【发布时间】:2014-06-04 22:13:00 【问题描述】:刚刚从 .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
【问题讨论】:
你能分享一个最简单的可复制代码示例,以便我们有代码可以推理吗? 我真的希望;我能做的最好的就是伪代码。不过,我所写的任何内容都会受到欢迎。 【参考方案1】:答案 (2):我必须添加代码来线性化或重新同步新的 STA 线程与旧的 MTA 线程(例如,阻塞父线程直到工作线程完成)。
thread.Join();
在伪代码中的 (A) 点效果很好,但在 (B) 点我有一些共享字段变量仍需要移动到线程参数中(不是所有 PDF 都被创建的潜在原因)
p>我承认我仍然不明白为什么需要在 STA 线程上处理通过网络归档文件的 FileSystemWatcher(问题 (1))。
【讨论】:
以上是关于FileSystemWatcher .Net 3.5的主要内容,如果未能解决你的问题,请参考以下文章
FileSystemWatcher - 文件复制期间的 3 个事件