有没有比Thread.Sleep()更好的方法来等待PrintOut()的例子?

时间:2012-03-05 15:05:51

标签: c# sleep infopath office-interop

我做了一个小函数,它应该打印一些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次触发该事件。

有两种不同的情况发生:

  1. 程序用InfoPath打开xml文件,没有任何反应, 它只是等待。 (“IsFileLocked”功能的原因。)事件 没有被触发。
  2. 在第一个文件打开后触发事件。之后,事件发生在每个文件中,一切正常。
  3. 兑现文件或类似的东西会出现问题吗?

    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();
    }
    

2 个答案:

答案 0 :(得分:0)

是的,使用异步编程。定义每个事件后要调用的回调函数。请参阅here

答案 1 :(得分:0)

  1. 订阅event _ApplicationEvents_QuitEventHandler Quit
  2. 退出应用程序之前,请等待信号量。
  3. 在事件处理程序中(即InfoPath应用程序退出时),打开信号量。