2

我读过其他一些看起来相似的问题,但我仍然很困惑,而且似乎没有一个答案对我有用,所以我决定再问一个问题。请多多包涵,我不是很精通线程和什么。

我正在制作的应用程序是 Revit Structure 的第 3 方插件。它们的工作方式是我拥有一个类库,其中包含一个实现接口的类,当它被称为我的应用程序运行时。

我的工具是一个打印工具,它旨在自动打印到 PDF。我正在尝试将我的代码移至使用 PdfCreator 打印 PDF(Revit 中的打印方式是您设置打印机并在 API 中调用“打印”方法,因此除了通过打印机)。

PDFCreator 有一个很棒的 COM 接口,允许您设置它的设置,以及订阅在每个文档打印后触发的事件。我多次调用 hte print 方法,所以我想等到一切都完成,然后在我的代码中做一些事情。

我的逻辑是这样的:

  1. 用户选择要打印的东西
  2. 点击打印按钮(在我的 WPF 窗口上)
  3. 我的代码然后设置 PDF 创建者设置,并注册以收听事件
  4. 我调用 Print() api 方法,然后需要一些时间来打印每个项目
  5. 然后,我希望在打印完所有内容后收到警报,并对文档进行一些“后期处理”。
  6. 后期处理包括重命名/移动 PDF 等等

我的问题是,当我调用 print 方法时,我的代码不会等待 PDFcreator 事件,它只是继续并退出,这意味着后处理永远不会被触发。

我需要做的是以某种方式等待事件,而不会阻塞。

在阅读了其他一些问题后,我尝试了这个:

  • AutoResetEvent,并使用 WaitOne,直到事件处理程序调用 Set()。这只是卡在 WaitOne 上并且从未继续。
  • Application.DoEvents 直到事件处理程序设置了某个类变量。
  • 我尝试创建一个新线程来注册活动,但这似乎没有帮助

如何让事件在新线程上触发,然后提醒当前线程继续?或者我怎样才能让代码等待事件触发?

如果您需要更多信息,请告诉我,很乐意提供。

4

1 回答 1

1

您的问题如下。该其他库需要一个正在运行的消息循环才能触发事件。特别是当某个消息从消息循环到达时,该消息被分派到库中并导致它触发事件。

如果您在调用代码中使用一些“等待”原语,则会阻塞消息循环,因此永远不会触发事件。您的程序不应阻塞 - 它应该像每个 Windows GUI 程序一样继续运行消息循环。

于 2010-06-17T05:46:48.053 回答