C # Необходимо дождаться события COM для запуска, прежде чем продолжить выполнение без контроля над событием - PullRequest
2 голосов
/ 16 июня 2010

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

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

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

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

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

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

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

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

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

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

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

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

1 Ответ

1 голос
/ 17 июня 2010

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

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

...