2012-03-13 10 views
4

私は別のものを実行するプログラムを持っています(最初のアプリケーションのStaterと2番目のapp-Workerを呼び出すことができます)。C#でプロセスを停止する方法、ファイル名を知っていますか?

私はスターターで

process.start(); 
process.waiForExit(); 
process.Close(); 

を使用しています。

しかし、労働者(一部のextern理由で)労働者がファイルをブロックし、プロセスにまだなります待っている間にスターターがメモリを食べて、閉鎖を余儀なくされている場合など

だから、私は労働者がすでに実行されているかどうかを確認したいです私はそれを開始しようとする前に。 私はProcess.GetProcessesByName( "worker.exe")を試しましたが、運がありません(タスクマネージャでWorkerが見えても)。

私はそのモジュールのためにメモリ内のすべてのプロセスをチェックについて、ここでいくつかのトピックを見てきましたが、それでも私はすでに、私はこのようなソリューションを避けるために願っています実行中のファイルを知っています。

アドバイスはありますか?

+0

あなたのタイトルは少し誤解を招いていました。私はあなたが*あまりにも明白な理由で起動プロセスの真のファイル名を隠すことを望んでいると思った:) –

+0

'Starter'は実際に' Worker'を起動しますか?そうであれば、作業者のすべてのプロセスID(Process.Idによって)を知ることができます。あなたは(より信頼性の高い)IDでそれらを処理することができます。 –

+0

@ Moo-Juice - それは私がそれをどのように読むのかです!タイトルには「C#」と「知る」の間にカンマが必然的に必要です。 – adelphus

答えて

4

Workerプロセスの起動時に、スタータープロセスを起動するときに、このIDをアプリケーションの構成/設定ファイルに保存します。まず、そのIDを設定ファイルからロードし、そのプロセスが現在実行中かどうか。 Workerプロセスをすぐに終了したい場合は、process.Kill()を呼び出してください。

+2

注意:Starterプロセスが再起動するまでにIDがリサイクルされている可能性があります。あなたはそれが実際に(まだ)あなたが思っているプロセスであることを確認するために追加のチェックが必要です。 –

+0

はい、そのプロセスの名前が**ワーカー**であるかのようにチェックしてください。 – Coder

+0

はい、私もそれについて考えました、ありがとう! –

11

あなたがそれを見つけることができない理由は、あなたが.exeを使用しているからです。実行ファイルは、タスクマネージャでworker.exeとして表示する場合は、単に呼び出す:

Process[] workers = Process.GetProcessesByName("worker") 
foreach (Process worker in workers) 
{ 
    worker.Kill(); 
    worker.WaitForExit(); 
    worker.Dispose(); 
} 
+0

私はそれを(100%正解!)アップフォートしましたが、リストに保存するIDを持つものが私のお気に入りです。 –

+0

問題ありません。あなたの問題を解決してうれしいです。 IDでプロセスを取得したら、プロセス名が "worker.exe"であることを確認してください。これにより、最後に保存したIDを取得した別のプロセスを強制終了させないようにします。 – Tung

1

あなたはGetProcessesByName(「労働者」)を呼び出すとMSDN
にそして、あなたが希望する場合で説明したように
あなたがexeファイルの拡張子を指定しませんあなたが起動したプロセスオブジェクトでグローバル変数を保持するには、単にprocess.Kill();を使用します。

1

あなただけの「労働者」が実行されていることを検出に必要がある場合は、技術的に非常に優れたソリューションは、その寿命の期間中、それをlock a global mutexを持っています。ミューテックスの名前を知っているプロセス(あなたが管理している)は、ミューテックスがロックされているかどうかを確認することができます(ワーカーが実行中の場合)。

あなただけの権利を取得したい多くのほとんどの詳細があるのでしかし、これはnot easy to implement correctlyです。それでも実際には「スターター」と「ワーカー」の競合状態が同時に起きる可能性があります(もちろん、この問題や他の多くの問題は他のすべてのソリューションにも当てはまり、欠点とはみなされません)。

4

これは非常に簡単です...(それが実行されている場合)

System.Diagnostics.Process.Start("cmd.exe","/c taskkill /IM notepad.exe"); 

このコードは、メモ帳を閉じます。拡張子(.exe)で閉じるプログラム名を入力します。

一部のアプリケーションは強制的に停止することはできません。 taskkillの後に/Fを使用して、アクションを強制します。 プロセスツリーを閉じる場合は、プログラム名の後に/Tを使用してください。

System.Diagnostics.Process.Start("cmd.exe","/c taskkill /F /IM notepad.exe /T"); 
関連する問題