Я прочитал несколько других вопросов, которые кажутся похожими, но я все еще очень запутался, и ни один из ответов, похоже, не работает для меня, поэтому я решил задать другой вопрос. Пожалуйста, потерпите меня, я не очень хорошо разбираюсь в многопоточности и во всем остальном.
Приложение, которое я делаю, является надстройкой стороннего производителя для Revit Structure. Они работают следующим образом: у меня есть библиотека классов с классом, который реализует интерфейс, когда это вызывается моим приложением.
Мой инструмент — это инструмент для печати, он предназначен для автоматизации печати в PDF. Я пытаюсь переместить свой код на использование PdfCreator для печати PDF-файлов (способ печати в Revit заключается в том, что вы устанавливаете принтер и вызываете метод «печати» в API, поэтому я не могу делать PDF-файлы каким-либо другим способом, кроме как через Принтер).
PDFCreator имеет отличный интерфейс COM, который позволяет вам устанавливать его настройки, а также подписываться на событие, которое срабатывает после печати каждого документа. Я вызываю метод hte print несколько раз, поэтому я хочу подождать, пока все не будет сделано, а затем сделать что-то в своем коде.
Моя логика выглядит следующим образом:
- Пользователь выбирает объекты для печати
- Нажимает кнопку «Печать» (в моем окне WPF)
- Затем My Code задает настройки создателя PDF и регистрируется для прослушивания события.
- Я вызываю метод API Print(), который затем занимает некоторое время для печати каждого из элементов.
- Затем я хочу быть предупрежден, когда все будет готово для печати, и выполнить некоторую «постобработку» документов.
- Постобработка включает в себя, среди прочего, переименование/перемещение PDF-файлов.
Моя проблема в том, что когда я вызываю метод печати, мой код не ждет событий PDFcreator, он просто продолжает и завершает работу, что означает, что постобработка никогда не запускается.
Что мне нужно сделать, так это дождаться события, не блокируя его.
Прочитав некоторые другие вопросы, я попробовал это:
- AutoResetEvent и используйте функцию WaitOne, пока обработчик события не вызовет Set(). Это просто застряло на WaitOne и больше не продолжалось.
- Application.DoEvents до тех пор, пока обработчик событий не установит определенную переменную класса.
- Я пытался создать новую тему, чтобы подписаться на события, но это, похоже, не помогло.
как мне запустить событие в новом потоке, а затем предупредить текущий поток, чтобы он продолжал работать? Или как я могу заставить код ждать, пока событие сработает?
Дайте мне знать, если вам нужна дополнительная информация, с удовольствием предоставлю.