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