C# Необходимо дождаться события COM для запуска, прежде чем продолжить выполнение без контроля над событием
Я прочитал несколько других вопросов, которые кажутся похожими, но я все еще в замешательстве, и ни один из ответов, кажется, не работает для меня, поэтому я решил задать другой вопрос. Пожалуйста, потерпите меня, я не очень хорошо разбираюсь в потоке, а что нет.
Приложение, которое я делаю, является сторонним надстройкой для Revit Structure. Они работают так: у меня есть библиотека классов с классом, который реализует интерфейс, когда это называется, мое приложение запускается.
Мой инструмент - инструмент печати, он предназначен для автоматизации печати в PDF. Я пытаюсь перенести свой код на использование PdfCreator для печати PDF-файлов (печать работает в Revit, когда вы устанавливаете принтер и вызываете метод "print" в API, поэтому я не могу делать PDF-файлы иначе, чем через Принтер).
PDFCreator имеет отличный COM-интерфейс, который позволяет вам устанавливать его настройки, а также подписываться на событие, которое срабатывает после печати каждого документа. Я вызываю метод печати несколько раз, поэтому я хочу подождать, пока все не будет сделано, а затем сделать что-то в моем коде.
Моя логика выглядит так:
- Пользователь выбирает вещи для печати
- Хиты Кнопка печати (в моем окне WPF)
- Затем мой код устанавливает настройки создателя PDF и регистрируется для прослушивания события
- Я вызываю метод API Print(), который затем занимает некоторое время для печати каждого элемента
- Затем я хочу получать уведомления о завершении печати и выполнять некоторую "постобработку" документов.
- Постобработка включает переименование / перемещение PDF-файлов среди прочего
Моя проблема в том, что когда я вызываю метод print, мой код не ждет событий PDF creator, он просто продолжается и завершается, что означает, что пост-обработка никогда не запускается.
Что мне нужно сделать, так это как-то дождаться события, не блокируя.
После прочтения некоторых других вопросов я попробовал это:
- AutoResetEvent и используйте WaitOne, пока обработчик событий не вызовет Set(). Это просто застряло на WaitOne и никогда не продолжалось.
- Application.DoEvents до тех пор, пока определенная переменная класса не будет установлена обработчиком события.
- Я пытался создать новый поток, чтобы подписаться на события, но это, похоже, не помогло
Как сделать так, чтобы событие сработало в новом потоке, а затем предупредить текущий поток о продолжении работы? Или как я могу заставить код ждать события?
Дайте мне знать, если вам нужно больше информации, рад предоставить.
1 ответ
Ваша проблема заключается в следующем. Эта другая библиотека нуждается в работающем цикле сообщений, чтобы иметь возможность запустить событие. В частности, когда из цикла сообщений поступает определенное сообщение, оно отправляется в библиотеку и вызывает событие.
Если вы используете какой-то примитив ожидания в своем коде вызова, вы блокируете цикл обработки сообщений и, таким образом, событие никогда не запускается. Ваша программа не должна блокировать - она должна продолжать выполнять цикл обработки сообщений, как это делает любая программа Windows GUI.