我已經做了一個小功能,應該打印一些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次發起一次。
有其發生兩種不同的情況:
- 程序打開使用InfoPath的xml文件,並沒有任何反應, 它只是等待。 (「IsFileLocked」功能的原因。)事件 未被觸發。
- 事件在第一個文件打開後觸發。之後,事件發生在每個文件,一切正常。
它可能是一個與兌現文件或類似的問題?
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();
}
通常,InfoPath提供的反饋應該等待您的等待。 Thread.Sleep(0)可用於微優化放棄時間片。否則,使用Thread.Sleep()等待結果是一個等待發生的錯誤。 – GregC 2012-03-05 15:11:08
如何確保您的打印輸出在您醒來時正確完成?你怎麼能確定線程不會被中斷喚醒? – 2012-03-05 15:12:04
@ stt-lcu我不是。我只是希望 :)。這就是爲什麼我要求更好的方法。 – hofmeister 2012-03-05 15:15:42