2010-06-16 30 views
2

我已經閱讀了幾個其他類似的問題,但我仍然很困惑,並且沒有任何答案似乎對我有用所以我決定再問一個問題。請耐心等待,我對通過線程不太熟悉,哪些不是。C#在繼續執行之前需要等待COM事件觸發,而無需控制事件

我正在製作的應用程序是Revit Structure的第三方加載項。他們的工作方式是我有一個類庫實現一個接口,當我的應用程序運行。

我的工具是一種打印工具,它旨在將打印自動化爲PDF。我試圖將我的代碼轉移到使用PdfCreator來打印PDF(在Revit中打印的方式是您設置打印機並在API中調用「打印」方法,因此除了通過打印方式之外,我無法執行任何PDF打印機)。

PDFCreator有一個很棒的COM接口,可以讓你設置它的設置,也可以訂閱每個文檔打印後觸發的事件。我多次調用hte打印方法,所以我想等到所有完成後,然後在我的代碼中執行一些操作。

我的邏輯是這樣的:

  1. 用戶選擇的東西打印
  2. 點擊打印按鈕(我的WPF窗口)
  3. 我的代碼然後設置PDF創建者設置,並註冊聽事件
  4. 我調用打印()API方法,然後需要一些時間來打印每個項目的
  5. 然後我想,當一切完成打印到被警告,並做一些「後處理」的文檔uments。
  6. 後處理包括重命名/走動PDF文件除其他事項外

我的問題是,當我把打印的方法,我的代碼不會等待的PDFCreator事件,它只是通過和出口繼續,這意味着後期處理從未被解僱。

我需要做的是以某種方式等待事件,沒有阻塞。

讀我已經試過這一些其他的問題後:

  • 的AutoResetEvent,並使用了WaitOne直到事件處理程序調用設置()。這只是停留在WaitOne上,從未繼續。
  • Application.DoEvents直到某一類變量已由事件處理程序中設置..
  • 我試圖創建一個新的線程來簽署該事件,但沒有似乎幫助

我該怎麼辦讓事件在新線程上觸發,然後提醒當前線程繼續前進?或者我該如何讓代碼等待事件觸發?

讓我知道如果您需要更多的信息,很樂意提供。

回答

1

您的問題是以下。其他庫需要一個正在運行的消息循環才能激發事件。特別是當某個消息從消息循環到達時,該消息被分派到庫中並使其觸發事件。

如果您在調用代碼中使用某些「等待」原語,則會阻止消息循環,因此事件永遠不會被觸發。你的程序不應該阻塞 - 它應該像每個Windows GUI程序一樣繼續運行消息循環。

+0

我該如何繼續運行消息循環?我是否需要展示表格並等待事件(我遇到了一些麻煩,但可能已經放棄了太早)? 我的程序調用Print()API方法,然後我想等待打印紙張,當它們完成時,執行其他操作。我是否在等待時顯示錶格,然後事件會觸發? – RodH257 2010-06-17 07:01:53

+0

當試圖使用ShowDialog顯示一個Gui時,我得到一個AccessViolationException,關於讀寫受保護的內存 – RodH257 2010-06-17 07:10:02

+0

您必須顯示一些窗口並保留它。你有沒有注意到,如果窗口上有一個按鈕,並且你點擊該按鈕,該按鈕的事件處理程序被觸發?這要歸功於正在運行的消息循環。你也可以依靠它來處理COm事件處理程序。您只需保持窗口,消息循環正在運行,事件觸發並改變消息處理程序的狀態。 – sharptooth 2010-06-17 08:01:29

相關問題