Отслеживание нескольких процессов одновременно - PullRequest
1 голос
/ 29 апреля 2011


У меня есть приложение (winforms), которое загружает файл во временную папку пользователя, затем открывает файл для просмотра содержимого пользователем, и когда файл закрывается, файл удаляется из временной папки.Приложение работает нормально, если я открываю, скажем, один .pdf и один .doc. Проблема возникает при попытке открыть один .doc, если другой процесс winword все еще выполняется (не имеет значения, открыт ли моим приложением или напрямую пользователем).

Я использую следующий код:

_OpenFileProces = System.Diagnostics.Process.Start(TempFileName);
_OpenFileProces.EnableRaisingEvents = true;
_OpenFileProces.Exited += new EventHandler(_OpenFileProces_Exited);

и этот, чтобы очистить temp

void _OpenFileProces_Exited(object sender, EventArgs e)
    {
        string s = ((System.Diagnostics.Process)sender).StartInfo.FileName;
        System.IO.File.Delete(s);
    }

Кажется, что запущенный процесс останавливает мой собственный..и из-за остановки он удалит файл или выдаст ошибку при попытке удалить файл.
Есть ли у вас какие-либо предложения, как я могу открыть свой собственный процесс?Дело в том, что я не знаю, какой тип файла мне нужно открыть (это может быть что угодно), и я рассчитываю на окна, чтобы выбрать лучшее приложение.из моего теста блокнот работает нормально, но winword и acrobat закрывают мой процесс.
Спасибо

Ответы [ 2 ]

2 голосов
/ 29 апреля 2011

Я подозреваю, что Microsoft Word делает то же самое, что и Рэймонд Чен описывает оболочку Windows как здесь :

Клиент хотел помочь с мониторингом срока службыокно проводника.

" Мы хотим запустить копию Проводника, чтобы открыть определенную папку, затем дождаться, пока пользователь закроет папку, прежде чем продолжить. Мы попытались запустить копию Проводника спапка в командной строке, затем делает WaitForSingleObject для дескриптора процесса, но ожидание иногда завершается немедленно, без ожидания. Как мы можем ждать, пока пользователь закроет окно проводника?"

Это еще один случай решения проблемы на полпути, а затем проблемы с другой половиной.

Причина, по которой Wait­For­Single­Object немедленно возвращается, заключается в том, что Explorer - это программа с одним экземпляром (ну, с ограниченным экземпляром).Когда вы открываете окно Проводника, запрос передается работающей копии Проводника, и запущенная копия Проводника завершается.Вот почему ваш Wait­For­Single­Object возвращается немедленно.

В вашем случае Word уже запущен, поэтому, когда вы создаете секундный процесс Word и инструктируете его открыть ваш документ, онпросто передает запрос экземпляру Word, который уже запущен, и немедленно завершает второй запущенный вами процесс.

Это то, что вы видите, когда говорите, что «запущенный процесс останавливает мой собственный».Поскольку этот второй экземпляр закрывается сразу после его запуска, возникает событие Exited, и ваш код сообщает ему об удалении файла!

Вы проницательно замечаете, что Блокнот (в отличие от Word и Adobe Acrobat) работает просто отлично,Это потому, что Блокнот предназначен для нескольких экземпляров приложения.Вы можете открыть столько копий Блокнота, сколько захотите;это не волнует, если на рабочем столе уже открыто 1 или 6 копий.И что еще более важно, запрос оболочки на открытие текстового документа в Блокноте фактически открывает вторую копию приложения Notepad, а не отправляет запрос в первый экземпляр для открытия нового окна.для нового документа.

1 голос
/ 29 апреля 2011

Вы должны установить Process.StartInfo.UseShellExecute на true, как это _OpenFileProces.StartInfo.UseShellExecute = true;, прежде чем запускать процесс, а затем он должен работать, я думаю ...

...