0

刚刚从 .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
4

1 回答 1

0

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

thread.Join();

这在伪代码中的 (A) 点运行良好,但在 (B) 点运行良好,在该点我有一些共享字段变量仍需要移动到线程参数中(并非所有 PDF 都被创建的潜在原因)

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

于 2014-04-21T10:40:27.427 回答