我读过其他一些看起来相似的问题,但我仍然很困惑,而且似乎没有一个答案对我有用,所以我决定再问一个问题。请多多包涵,我不是很精通线程和什么。
我正在制作的应用程序是 Revit Structure 的第 3 方插件。它们的工作方式是我拥有一个类库,其中包含一个实现接口的类,当它被称为我的应用程序运行时。
我的工具是一个打印工具,它旨在自动打印到 PDF。我正在尝试将我的代码移至使用 PdfCreator 打印 PDF(Revit 中的打印方式是您设置打印机并在 API 中调用“打印”方法,因此除了通过打印机)。
PDFCreator 有一个很棒的 COM 接口,允许您设置它的设置,以及订阅在每个文档打印后触发的事件。我多次调用 hte print 方法,所以我想等到一切都完成,然后在我的代码中做一些事情。
我的逻辑是这样的:
- 用户选择要打印的东西
- 点击打印按钮(在我的 WPF 窗口上)
- 我的代码然后设置 PDF 创建者设置,并注册以收听事件
- 我调用 Print() api 方法,然后需要一些时间来打印每个项目
- 然后,我希望在打印完所有内容后收到警报,并对文档进行一些“后期处理”。
- 后期处理包括重命名/移动 PDF 等等
我的问题是,当我调用 print 方法时,我的代码不会等待 PDFcreator 事件,它只是继续并退出,这意味着后处理永远不会被触发。
我需要做的是以某种方式等待事件,而不会阻塞。
在阅读了其他一些问题后,我尝试了这个:
- AutoResetEvent,并使用 WaitOne,直到事件处理程序调用 Set()。这只是卡在 WaitOne 上并且从未继续。
- Application.DoEvents 直到事件处理程序设置了某个类变量。
- 我尝试创建一个新线程来注册活动,但这似乎没有帮助
如何让事件在新线程上触发,然后提醒当前线程继续?或者我怎样才能让代码等待事件触发?
如果您需要更多信息,请告诉我,很乐意提供。