Process.Start блокируется - PullRequest
       32

Process.Start блокируется

6 голосов
/ 19 июня 2010

Я вызываю Process.Start, но он блокирует текущий поток.

pInfo = new ProcessStartInfo("C:\\Windows\\notepad.exe");

// Start process
mProcess = new Process();
mProcess.StartInfo = pInfo;
if (mProcess.Start() == false) {
    Trace.TraceError("Unable to run process {0}.");
}

Даже когда процесс закрыт, код больше не отвечает.

Но Process.Start действительно должен блокировать? Что происходит?

(процесс запускается правильно)


using System;
using System.Diagnostics;
using System.Threading;
using System.Windows.Forms;

namespace Test
{
    class Test
    {
        [STAThread]
        public static void Main()
        {
            Thread ServerThread = new Thread(AccepterThread);
            ServerThread.Start();

            Console.WriteLine (" ---  Press ENTER to stop service ---");
            while (Console.Read() < 0) { Application.DoEvents(); }

            Console.WriteLine("Done.");
        }

        public static void AccepterThread(object data)
        {
            bool accepted = false;

            while (true) {
                if (accepted == false) {
                    Thread hThread = new Thread(HandlerThread);
                    accepted = true;
                    hThread.Start();
                } else
                    Thread.Sleep(100);
            }
        }

        public static void HandlerThread(object data)
        {
            ProcessStartInfo pInfo = new ProcessStartInfo("C:\\Windows\\notepad.exe");

            Console.WriteLine("Starting process.");

            // Start process
            Process mProcess = new Process();
            mProcess.StartInfo = pInfo;
            if (mProcess.Start() == false) {
                Console.WriteLine("Unable to run process.");
            }
            Console.WriteLine("Still living...");
        }
    }
}

Вывод на консоль:

--- Нажмите ENTER, чтобы остановить обслуживание --- Запуск процесса.


Нашел:

[STAThread]

Делает блокировку Process.Start. Я прочитал STAThread и Multithreading , но не могу связать концепции с поведением Process.Start.

AFAIK, STAThread - требуется для Windows.Form. Как обойти эту проблему при использовании Windows.Form?


Новости для ада:

Если я перестраиваю свое приложение, то первый первый раз, когда я правильно запускаю приложение, но если я прекращаю отладку и снова запускаю iy, проблема возникает.

Проблема не возникает, когда приложение выполняется без отладчика.

Ответы [ 4 ]

10 голосов
/ 19 июня 2010

Нет, Process.Start не ждет завершения дочернего процесса ... иначе вы не сможете использовать такие функции, как перенаправленный ввод / вывод.

Пример консольного приложения:

using System;
using System.Diagnostics;

public class Test
{
    static void Main()
    {
        Process p = new Process { 
            StartInfo = new ProcessStartInfo("C:\\Windows\\notepad.exe")
        };
        p.Start();
        Console.WriteLine("See, I'm still running");
    }
}

На моем ящике печатается надпись «Смотрите, я все еще работаю» без проблем - что она делает на вашем ящике?

7 голосов
/ 09 сентября 2012

Создайте ProcessStartInfo и установите для UseShellExecute значение false (по умолчанию установлено значение true). Ваш код должен читать:

pInfo = new ProcessStartInfo("C:\\Windows\\notepad.exe");
pInfo.UseShellExecute = false;

// Start process
mProcess = new Process();
mProcess.StartInfo = pInfo;
if (mProcess.Start() == false) {
    Trace.TraceError("Unable to run process {0}.");
}

У меня была та же проблема, и запуск исполняемого файла, создающего процесс непосредственно из исполняемого файла, решил проблему.

1 голос
/ 15 июня 2016

Я испытывал такое же поведение блокировки, что и исходный плакат в приложении WinForms, поэтому я создал нижеприведенное консольное приложение, чтобы упростить тестирование этого поведения.

Пример Джона Скита использует Блокнот, который занимает всего несколько миллисекундчтобы загрузить нормально, поэтому блок потока может остаться незамеченным.Я пытался запустить Excel, который обычно занимает намного больше времени.

using System;
using System.Diagnostics;
using static System.Console;
using System.Threading;

class Program {

    static void Main(string[] args) {

        WriteLine("About to start process...");

        //Toggle which method is commented out:

        //StartWithPath();  //Blocking
        //StartWithInfo();  //Blocking
        StartInNewThread(); //Not blocking

        WriteLine("Process started!");
        Read();
    }

    static void StartWithPath() {
        Process.Start(TestPath);
    }

    static void StartWithInfo() {
        var p = new Process { StartInfo = new ProcessStartInfo(TestPath) };
        p.Start();
    }

    static void StartInNewThread() {
        var t = new Thread(() => StartWithPath());
        t.Start();
    }

    static string TestPath =
        Environment.GetFolderPath(Environment.SpecialFolder.Desktop) +
        "\\test.xlsx";
}

Вызовы StartWithPath и StartWithInfo блокируют мою ветку в консольном приложении.Моя консоль не отображает «Процесс запущен» до тех пор, пока заставка Excel не закроется и главное окно не откроется.

enter image description here

StartInNewThread отобразит обасообщения на консоли немедленно, а заставка для Excel все еще открыта.

0 голосов
/ 11 ноября 2017

У нас была эта проблема при запуске скрипта .bat, который находился на сетевом диске в другом домене (у нас есть два доверенных домена).Я запустил удаленный отладчик C # и убедился, что Process.Start () блокировался бесконечно.

При интерактивном повторении этой задачи в Power Shell выскочил диалог безопасности:

enter image description here

Что касается решения, это было направление , в которое мы пошли.Человек, который выполнял эту работу, изменил объект групповой политики домена для достижения доверия.

...