C# Необходимо дождаться события COM для запуска, прежде чем продолжить выполнение без контроля над событием

Я прочитал несколько других вопросов, которые кажутся похожими, но я все еще в замешательстве, и ни один из ответов, кажется, не работает для меня, поэтому я решил задать другой вопрос. Пожалуйста, потерпите меня, я не очень хорошо разбираюсь в потоке, а что нет.

Приложение, которое я делаю, является сторонним надстройкой для Revit Structure. Они работают так: у меня есть библиотека классов с классом, который реализует интерфейс, когда это называется, мое приложение запускается.

Мой инструмент - инструмент печати, он предназначен для автоматизации печати в PDF. Я пытаюсь перенести свой код на использование PdfCreator для печати PDF-файлов (печать работает в Revit, когда вы устанавливаете принтер и вызываете метод "print" в API, поэтому я не могу делать PDF-файлы иначе, чем через Принтер).

PDFCreator имеет отличный COM-интерфейс, который позволяет вам устанавливать его настройки, а также подписываться на событие, которое срабатывает после печати каждого документа. Я вызываю метод печати несколько раз, поэтому я хочу подождать, пока все не будет сделано, а затем сделать что-то в моем коде.

Моя логика выглядит так:

  1. Пользователь выбирает вещи для печати
  2. Хиты Кнопка печати (в моем окне WPF)
  3. Затем мой код устанавливает настройки создателя PDF и регистрируется для прослушивания события
  4. Я вызываю метод API Print(), который затем занимает некоторое время для печати каждого элемента
  5. Затем я хочу получать уведомления о завершении печати и выполнять некоторую "постобработку" документов.
  6. Постобработка включает переименование / перемещение PDF-файлов среди прочего

Моя проблема в том, что когда я вызываю метод print, мой код не ждет событий PDF creator, он просто продолжается и завершается, что означает, что пост-обработка никогда не запускается.

Что мне нужно сделать, так это как-то дождаться события, не блокируя.

После прочтения некоторых других вопросов я попробовал это:

  • AutoResetEvent и используйте WaitOne, пока обработчик событий не вызовет Set(). Это просто застряло на WaitOne и никогда не продолжалось.
  • Application.DoEvents до тех пор, пока определенная переменная класса не будет установлена ​​обработчиком события.
  • Я пытался создать новый поток, чтобы подписаться на события, но это, похоже, не помогло

Как сделать так, чтобы событие сработало в новом потоке, а затем предупредить текущий поток о продолжении работы? Или как я могу заставить код ждать события?

Дайте мне знать, если вам нужно больше информации, рад предоставить.

1 ответ

Решение

Ваша проблема заключается в следующем. Эта другая библиотека нуждается в работающем цикле сообщений, чтобы иметь возможность запустить событие. В частности, когда из цикла сообщений поступает определенное сообщение, оно отправляется в библиотеку и вызывает событие.

Если вы используете какой-то примитив ожидания в своем коде вызова, вы блокируете цикл обработки сообщений и, таким образом, событие никогда не запускается. Ваша программа не должна блокировать - она ​​должна продолжать выполнять цикл обработки сообщений, как это делает любая программа Windows GUI.

Другие вопросы по тегам