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 个事件

FileSystemWatcher监听文件是否有被修改

FileSystemWatcher用法详解

FileSystemWatcher用法详解

Powershell FileSystemWatcher 脚本在一些新文件上触发两次

使用filesystemwatcher时怎么处理大文件