2012-01-04 15 views
2

私はフォームアプリケーションを作成しています。これは、別のスレッドでもコンソールプロセスを実行します。基本的には、アプリケーション終了後にボタンのブロックを解除する必要があります。イベントハンドラを作成する前に、完了後のプロセスは停止しましたが、今度はイベント後にアプリケーション自体が強制終了されます。ここでプロセス終了イベントに対するアプリケーション終了

は、プロセスの実行を行うためのコードです:

public void CallConsole()//This Calls the console application 
{ 
    Thread.CurrentThread.IsBackground = true; 
    Process p = new Process(); 
    p.StartInfo.UseShellExecute = false; 
    p.StartInfo.RedirectStandardOutput = true; 
    p.StartInfo.RedirectStandardError = true; 
    p.StartInfo.FileName = filename; 
    if (checkBox1.Checked) 
     p.StartInfo.CreateNoWindow = true; 
    p.EnableRaisingEvents = true; 
    p.OutputDataReceived += new DataReceivedEventHandler(p_OutputDataReceived); 
    p.ErrorDataReceived += new DataReceivedEventHandler(p_OutputDataReceived); 
    p.Exited += new EventHandler(p_Exited); 
    p.Disposed += new EventHandler(p_Exited); 
    p.Start(); 
    p.BeginErrorReadLine(); 
    p.BeginOutputReadLine(); 
} 

私はThread.IsBackgroundプロパティで動作するようにしようとしたが、それは何も

を変更しなかったここで、イベントハンドラ自体がです:

void p_Exited(object sender, EventArgs e)//Process on exit or disposed will make button1 avalable 
{ 
    button1.Enabled = true; 
} 

追加後のアプリケーションの理由は何ですか?

p.EnableRaisingEvents = true; 

は、プロセスだけでなく、現在殺されていますか?

+0

@HansPassantありがとうございました! – TheBW

答えて

2

問題ここでは、

void p_Exited(object sender, EventArgs e)//Process on exit or disposed will make button1 available 
{ 
    button1.Enabled = true; 
} 

必要なことを呼び出したとエラー処理の任意の並べ替えを持っていませんでした。一度私はbutton1.InvokeRequiredをチェックする別の関数を追加しました。それが再びトラフ呼び出しを呼び出す場合は、それはうまく動きました。

1

ここでの問題は、Exitedイベントがスレッドプールスレッドで発生していることです。コントロールはUIスレッドでのみ変更できます。

あなたはBeginInvokeを呼び出すことができますが、それだけで設定することで、自分自身を呼び出すためにProcessオブジェクトを設定するには簡単です:

p.SynchronizingObject = button1; 

ButtonProcessオブジェクトがそのイベントを呼び出すために使用する、ISynchronizeInvokeを実装しています。

+0

私はこの種の答えを探していました。どうもありがとうございます。 – Hari

+0

@ハリの心配は、あなたは大歓迎です。 –

関連する問題