2011-12-19 8 views
1

プログラムのコードスレッドのリソースを配置することができませんでした。私はメモ帳を閉じたくはありません。
Unlockerを使用して問題を検出しようとしました。
結果のスクリーンショットは、以下のようなものです:C#Process.Start()は以下のようなものです

Result Image Link

それでは、私が欲しいのはexeファイルを起動して、すぐにすべてのスレッドリソースを配置します。または、プログラムが開かれている間、プログラムをアンインストールできません。不快なユーザーエクスペリエンスを引き起こす可能性があります。システムの再起動を要求することも不愉快です。 Unlockerはそれをうまくやり遂げることができます。 Unlockerを使用して親フォルダのロックを解除すると、メモ帳が閉じず、このプログラムファイルを通常どおり削除できます。

+4

なぜあなたは 'Dispose'を呼んでいます'using'ステートメントでラップされたオブジェクトに? –

+1

何をロックしますか?あなたは何をしようとしているのですか? – Shai

+1

まず、ステートメント自体を使用すると、その出口でdisposeが呼び出されます。 第2に、 'WaitForExit'を使いたいかもしれません。 – Rolice

答えて

1

の問題は、あなた決して近い実行中のプロセス、それがロックされていることを示すために、ロックフリーを引き起こす、実行し続けますので、 。

あなたがp.Close()と呼ばれるので、私は、あなたがやったと思う知っているが、トリックはProcess.Close() methodプロセスを閉じるために発生しないことです。メモ帳ウィンドウにWM_CLOSEまたはWM_QUITメッセージを送信しません。それは、プロセスに関連するリソースを解放するだけです。

代わりに、Process.CloseMainWindow() methodを使用する必要があります。これにより、ウィンドウにはWM_CLOSEというメッセージが送信され、正しく終了します。

だからあなたのコードは次のように見えるように更新する(誰か他の人が述べたように、あなたはすでにusing文でオブジェクトの作成をラップした場合、明示的にDisposeを呼び出す必要はありません):

using System.Diagnostics; 

class Test 
{ 
    static void Main() 
    { 
     using (Process p = Process.Start("notepad.exe")) 
     { 
      p.CloseMainWindow(); 
      p.Close(); 
     } 
    } 
} 

注ことにはProcess.Kill() methodを使用しますが、電源コードを壁からはずしてコンピュータの電源を切るのと同じです。アプリケーションをうまく閉じようとするのではなく、タスクマネージャの「終了タスク」をクリックするのと同じように、強制終了させます。したがって、プロセスがロックされている場合や、丁寧な終了要求に応答しない場合にのみ使用してください。


また、ローリスがコメントで述べたように、上記のコードはあまり役に立たないでしょう。あなたはメモ帳を開始してすぐにそれを閉じています。

代わりに、プロセスを開始し、ユーザーがそのプロセスとやり取りできるようにしてから、処理が完了した後にクリーンアップしたいと思うかもしれません。

この場合、Process.WaitForExit()メソッドを使用する必要があります。このメソッドは呼び出しスレッドをブロックし、プロセスが終了するまで無期限に待機します。ユーザーが最後にメモ帳を閉じると、コントロールはアプリケーションのスレッドに戻り、p.Close()に電話をかけることができます。例えば

using System.Diagnostics; 

class Test 
{ 
    static void Main() 
    { 
     using (Process p = Process.Start("notepad.exe")) 
     { 
      p.WaitForExit(); 
      p.Close(); 
     } 
    } 
} 
+0

ありがとうございます。問題は自己更新プロムグラムから来た。私は前にいくつかの他のプログラムを開くかもしれない自分のプログラムファイルを削除したい。 –

-4

はそれへの参照を取得せずにプロセスを起動してみてください:

Process.Start("notepad.exe"); 
+2

この回答は間違っていて有害です。決定された破壊はありません。 – GSerg

+0

あなたはその質問を読んだことがありますか? –

0

2つの解決策は、あなたがあなたのアプリケーションを終了する前に終了するには、プロセスを待ち、ここ

  1. アプリケーションであります。これを行うにはseveralwaysがあります。
  2. アプリケーションの終了時にプロセスを終了します。 nicelyまたはby force後者はあまり良くありません。ユーザーが何かを編集していた場合、データが失われる可能性があります。もし上記のケース#1では

あなたは(それを殺すためにボタンでおそらく)終了するメモ帳を待っていることを知らせるユーザーにダイアログか何かをポップアップ可能性が

関連する問題