2012-03-05 72 views
1

我已經做了一個小功能,應該打印一些InfoPath文件。有必要在某些時候停止線程,一切正常。如果我刪除Thread.Sleep();例如該功能關閉應用程序以更快。 現在我想知道,如果有更好的方法來解決這個問題,而不是停止線程?有沒有比Thread.Sleep()等待PrintOut()更好的方法?

這裏一塊功能:

Application InfoPath = new Microsoft.Office.Interop.InfoPath.Application(); 
XDocument InfoPathXml = InfoPath.XDocuments.Open(XmlFile); 
Thread.Sleep(Sleep); 
InfoPathXml.PrintOut(); 
Thread.Sleep(Sleep); 
InfoPath.Quit(); 
Thread.Sleep(Sleep); 

第一睡眠等待,直到InfoPath時打開該文檔。第二個,等待創建打印作業。最後一個等待文件保存。

編輯 這裏有一些新的代碼...但可悲的是,它不工作得很好......只是有時事件會被解僱。還有其他解決方案嗎?

try 
{ 
    Application InfoPath = new Microsoft.Office.Interop.InfoPath.Application(); 
    XDocument InfoPathXml = InfoPath.XDocuments.Open(XmlFile); 
    InfoPathXml.OnContextChange += new _XDocumentEventSink2_OnContextChangeEventHandler(XmlFileLoaded); 
    do 
    { 
     Thread.Sleep(0); 
    } while (IsFileLocked(TempPath) == true); 
    InfoPath.Quit(); 
} 
catch (Exception exp) 
{ 
    log.Write(exp.Message); 
} 

static private void XmlFileLoaded(DocEvent pEvent) 
{ 
    pEvent.XDocument.PrintOut(); 
} 

EDIT2

誰能想象爲什麼事件沒有被激活每次。如果我啓動該計劃,則該活動每4或5次發起一次。

有其發生兩種不同的情況:

  1. 程序打開使用InfoPath的xml文件,並沒有任何反應, 它只是等待。 (「IsFileLocked」功能的原因。)事件 未被觸發。
  2. 事件在第一個文件打開後觸發。之後,事件發生在每個文件,一切正常。

它可能是一個與兌現文件或類似的問題?

EDIT3

好了,用下面的事件處理,我可以解決這個問題:

_Application3 InfoPathApplication = null; 
ApplicationEvents InfoPathApplicationEvents = null; 

InfoPathApplication = (Microsoft.Office.Interop.InfoPath._Application3)InfoPath; 
InfoPathApplicationEvents = (Microsoft.Office.Interop.InfoPath.ApplicationEvents)InfoPathApplication.Events; 
InfoPathApplicationEvents.XDocumentOpen += new _ApplicationEvents_XDocumentOpenEventHandler(XmlFileLoaded); 


static private void XmlFileLoaded(_XDocument pEvent) 
{ 
    pEvent.PrintOut(); 
    //pEvent.XDocument.PrintOut(); 
} 
+1

通常,InfoPath提供的反饋應該等待您的等待。 Thread.Sleep(0)可用於微優化放棄時間片。否則,使用Thread.Sleep()等待結果是一個等待發生的錯誤。 – GregC 2012-03-05 15:11:08

+1

如何確保您的打印輸出在您醒來時正確完成?你怎麼能確定線程不會被中斷喚醒? – 2012-03-05 15:12:04

+0

@ stt-lcu我不是。我只是希望 :)。這就是爲什麼我要求更好的方法。 – hofmeister 2012-03-05 15:15:42

回答

0
  1. 訂閱event _ApplicationEvents_QuitEventHandler Quit
  2. 退出應用程序之前,等待一個信號量。
  3. 在事件處理程序(即,InfoPath應用程序退出時)中,打開信號量。
+0

你有一個小例子嗎?我有一些問題與MSDN文章和如何使用ApplicationEvent的方式。格爾茨。 – hofmeister 2012-03-07 07:07:02

+0

我找到以下內容:[COM加載項添加到InfoPath的自定義功能](http://msdn.microsoft.com/en-us/library/aa946869.aspx) 但他們如何得到InfoPathApplication和InfoPathApplicationEvents對象?我認爲它應該看起來像這樣:'Application t =(Microsoft.Office.Interop.InfoPath.Application)InfoPath; ApplicationEvents d =(Microsoft.Office.Interop.InfoPath.ApplicationEvents)t.Events;' – hofmeister 2012-03-07 07:26:31

+0

好吧,我明白了!看我的下一個**編輯**。謝謝你的幫助! – hofmeister 2012-03-07 07:40:16

0

是,使用asyncronous編程。定義每個事件後要調用的回調函數。請參閱here

相關問題