【问题标题】:C# Need to wait for a COM event to fire before continuing execution without control over eventC#需要等待COM事件触发才能继续执行而不控制事件
【发布时间】:2010-06-16 08:45:30
【问题描述】:

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

我正在制作的应用程序是 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 直到某个类变量已被事件处理程序设置..
  • 我尝试创建一个新线程来注册活动,但似乎没有帮助

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

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

【问题讨论】:

    标签: c# events com multithreading revit


    【解决方案1】:

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

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

    【讨论】:

    • 如何继续运行消息循环?我是否需要出示表格并等待活动(我在这方面遇到了一些麻烦,但可能放弃得太早了)?我的程序调用 Print() API 方法,然后我想等待工作表打印,完成后,做其他事情。我是否在等待时显示表单,然后触发事件?
    • 当尝试使用 ShowDialog 显示 Gui 时,我得到一个关于读写受保护内存的 AccessViolationException
    • 您必须显示一些窗口并保留它。您是否注意到如果窗口上有一个按钮并且您单击该按钮,则该按钮的事件处理程序会被触发?这要归功于正在为您运行的消息循环。您也依赖它来处理 COM 事件处理程序。您只需保留窗口,消息循环正在运行,事件触发并更改消息处理程序的状态。
    • 我认为值得一提(也许值得更新答案),“await”关键字并非如此。
    猜你喜欢
    • 2017-07-01
    • 2019-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-24
    • 2020-06-14
    • 1970-01-01
    相关资源
    最近更新 更多