6

この質問がすでに出されているかどうかはわかりませんが、何も見つかりませんでした。何か見つけられたら、正しい方向に導いてください。

基本的に、別の指定されたプロセス( "example.exe")が終了したときに発生するイベントを現在のC#プログラムに追加したいと思います。それは可能ですか?

それが不可能な場合は、代わりに、ダイレクトパス( "C:\ somefolderpaths ... \ example.exe")で指定されたプロセスが終了したときにイベントを発生させる方法はありますか?

追加するには:私のプログラムはプロセスexample.exeを開始しません。

4

2 に答える 2

3

C#4.0を使用している場合は、次のようなことができます。

 Task.Factory.StartNew(() => 
  { 
      var process = Process.Start("process.exe");
      process.WaitForExit();
  }).ContinueWith(

      //THE CODE THAT WILL RUN AFTER PROCESS EXITED.  

  ); 

編集

プロセスの作成者でない場合は、Process.GetProcessesByName関数を使用して、すでに使用可能なプロセスからプロセスを取得できます。

var process = Process.GetProcessesByName("process.exe");

このようにして、メインスレッドのブロックを回避し、外部プロセスが終了したときに必要なコードを実行できます。その間、もっと重要なことを続けてください。

于 2012-12-03T14:31:33.170 に答える
1

Exitedプロセスの所有者でなくても、イベントを使用できます。このコードは問題なく機能します。

var proc = Process.GetProcessesByName("notepad")[0];

proc.EnableRaisingEvents = true;
proc.Exited += (s, e) => { Console.Write("Done"); };

EnableRaisingEvents.NET側で発生し、プロセスの作成とは関係ありません。プロセスハンドルが通知されるのを待つことと関係があります。これは、たとえば次のように、任意の待機ハンドル(およびプロセスも待機ハンドル)を使用して実行できます。

var registration 
 = ThreadPool.RegisterWaitForSingleObject(waitHandle, callbackMethod, null, -1, true);

(スレッドプールからの)別のスレッドを実際に使用しているのは、コールバックの実行中だけです。待っている間、何もせずにスレッドを無駄にする必要はありません。

もちろん、同期プロセスの一部として待機したい場合でも、できればWaitForExitタイムアウトを使用して、を呼び出すことができます。RegisteredWaitHandleまたは、との周りに単純なラッパーを作成することもできますawait

于 2014-12-12T09:12:18.357 に答える