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