1

スレッドを 3 秒間スリープさせるコード行を追加しました。

強調表示されている 2 行のコードのいずれかのコメントを外すと、バグが発生します - スリープの追加に関連していることはわかっていますが、なぜですか?

myProcessはそれ自体がスレッドだと思います - 眠っているのはこのスレッドですか?
IE が 3 秒間開いたままになり、その後閉じられるようにするには、何を変更する必要がありますか?

class MyProcess {


    public static void Main() {

        Process myProcess = new Process();
        ProcessStartInfo ps = new ProcessStartInfo();

        try {

            ps.FileName = @"IExplore.exe";
            ps.WindowStyle = ProcessWindowStyle.Normal;
            myProcess.StartInfo = ps;
            myProcess.Start();

        } catch(Exception e) {
            Console.WriteLine(e.Message);
        }

        Thread.Sleep(3000);

        //>>>>>>>>following throw an error
        //myProcess.Kill();
        //myProcess.CloseMainWindow();
        //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

        Console.WriteLine("press [enter] to exit");
        Console.Read();
    }
}

これが私が受け取るエラーです

プロセスが終了したため、リクエストを処理できません

ここに画像の説明を入力

4

1 に答える 1

3

InvalidOperationException操作を完了できなかった場合は、 を受け取ります。コードでは、またはInvalidOperationExceptionを呼び出す前にプロセスが終了した場合に を受け取ることがあります。myProcess.Kill();myProcess.CloseMainWindow();

すでに終了しているプロセスを強制終了することはできません。これを修正するには、スレッドがアイドル状態のときにプロセスを閉じないようにします。コマンドを実行する前に、例外をキャッチするか、プロセスが終了したかどうかを確認できます。

class MyProcess
{
    public static void Main()
    {

        Process myProcess = new Process(); //Initialize a new Process of name myProcess
        ProcessStartInfo ps = new ProcessStartInfo(); //Initialize a new ProcessStartInfo of name ps

        try
        {
            ps.FileName = @"IExplore.exe"; //Set the target file name to IExplore.exe
            ps.WindowStyle = ProcessWindowStyle.Normal; //Set the window state when the process is started to Normal
            myProcess.StartInfo = ps; //Associate the properties to pass to myProcess.Start() from ps
            myProcess.Start(); //Start the process

        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message); //Write the exception message
        }

        Thread.Sleep(3000); //Stop responding for 3 seconds

        if (myProcess.HasExited) //Continue if the process has exited
        {
            //The process has exited
            //Console.WriteLine("The process has exited");
        }
        else //Continue if the process has not exited
        {
            //myProcess.CloseMainWindow(); //Close the main Window
            myProcess.Kill(); //Terminate the process
        }

        Console.WriteLine("press [enter] to exit"); //Writes press [enter] to exit
        Console.Read(); //Waits for user input
    }
}

注意: IE8 を実行している場合、Internet Explorer 8 が変更を実装したことに気付くかもしれません。複数の開いているブラウザー ウィンドウまたはフレームは、ユーザーが開いた新しい IE フレーム ウィンドウを含む、開いているすべてのタブとウィンドウで同じセッション Cookie を共有します。

引数-nomergeを指定してプロセスIExplore.exeを実行し、新しい IE8 ウィンドウ セッションを実行して、作成した新しいプロセスと以前に作成したプロセス (IE8 によって作成され、他のプロセスとマージされる既定のプロセス) をマージしないようにすることができます。したがって、IE8 によって作成されたプロセスではなく、アプリケーションから制御できる新しいプロセスを持つことになります。

Process myProcess = new Process(); //Initialize a new Process of name myProcess
ProcessStartInfo ps = new ProcessStartInfo(); //Initialize a new ProcessStartInfo of name ps

try
{
    ps.FileName = @"IExplore.exe"; //Set the target file name to IExplore.exe
    ps.Arguments = "-nomerge";
    ps.WindowStyle = ProcessWindowStyle.Normal; //Set the window state when the process is started to Normal
    myProcess.StartInfo = ps; //Associate the properties to pass to myProcess.Start() from ps
    myProcess.Start(); //Start the process
}
catch (Exception e)
{
    Console.WriteLine(e.Message); //Write the exception message
}

Thread.Sleep(3000); //Stop responding for 3 seconds

if (myProcess.HasExited) //Continue if the process has exited
{
    //The process has exited
    //Console.WriteLine("The process has exited");
}
else //Continue if the process has not exited; evaluated if the process was not exited.
{
    myProcess.Kill(); //Terminate the process
}

さらに、プロセス終了コードは-1、IE8 のプロセスが予期せず1終了した場合、ユーザーによって終了された場合、および0別のインスタンスに制御を渡して終了した場合と同じになります。

ありがとう、
これがお役に立てば幸いです:)

于 2013-01-29T14:51:20.417 に答える