Есть ли лучший способ, чем Thread.Sleep (), например, ждать PrintOut ()? - PullRequest
1 голос
/ 05 марта 2012

Я сделал небольшую функцию, которая должна печатать некоторые файлы 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. Программа открывает XML-файл с InfoPath, и ничего не происходит, просто ждет.(Причина функции «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();
}

Ответы [ 2 ]

0 голосов
/ 06 марта 2012
  1. Подписаться на событие _ApplicationEvents_QuitEventHandler Quit
  2. Перед выходом из приложения дождитесь семафора.
  3. В обработчике событий (то есть, когда InfoPathприложение выходит), откройте семафор.
0 голосов
/ 05 марта 2012

Да, используйте асинхронное программирование.Определите функцию обратного вызова, которая будет вызываться после каждого события.Смотрите здесь .

...