我做了一个小函数,它应该打印一些InfoPath文件。有必要在某些时候停止线程,一切正常。如果我删除了Thread.Sleep();
,例如该函数将应用程序关闭为快速。
现在我想知道,如果有更好的方法来解决这个问题而不是停止线程吗?
这里有一部分功能:
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次触发该事件。
有两种不同的情况发生:
兑现文件或类似的东西会出现问题吗?
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();
}
答案 0 :(得分:0)
是的,使用异步编程。定义每个事件后要调用的回调函数。请参阅here。
答案 1 :(得分:0)