![](/img/trans.png)
[英]Using SendMessage() to minimize all windows, but need a more efficient way than Thread.Sleep() to wait until the legacy desktop is showing
[英]Is there a better way than Thread.Sleep() to wait for example for PrintOut()?
我做了一个小功能,应该打印一些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();
}
编辑2
任何人都可以想象为什么事件不会每次都激活。 如果我启动程序,则该事件每4或5次触发一次。
发生两种不同的情况:
兑现文件可能是一个问题,还是类似的问题?
编辑3
好了,通过以下事件处理,我可以解决问题:
_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();
}
是的,请使用异步编程。 定义在每个事件之后要调用的回调函数。 看这里 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.