8

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 を押してサービスを停止します --- プロセスを開始します。


それを見つけた:

[スタスレッド]

Process.Start をブロックします。STAThread と Multithreadingを読みましたが、その概念を Process.Start の動作と関連付けることができません。

私の知る限り、Windows.FormにはSTAThreadが必要です。Windows.Form を使用している場合、この問題を回避するにはどうすればよいですか?


地獄のニュース:

アプリケーションを再構築すると、アプリケーションを初めて実行したときは正しく動作しますが、デバッグを停止して iy を再起動すると、問題が発生します。

アプリケーションがデバッガなしで実行された場合、問題は発生しません。

4

5 に答える 5

13

いいえ、Process.Start子プロセスが完了するのを待ちません... そうしないと、リダイレクトされた I/O などの機能を使用できません。

サンプル コンソール アプリ:

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

これにより、ボックスに問題なく「See, I'm still running」と表示されます。ボックスで何をしているのですか?

于 2010-06-19T19:23:49.803 に答える
7

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}.");
}

同じ問題があり、実行可能ファイルから直接プロセスを作成する実行可能ファイルを開始すると、問題が解決しました。

于 2012-09-09T00:15:46.250 に答える