2009-06-30 5 views
3

をWinFormsの再起動しない私はこの問題は、検査が数週間後に6があることを示すことである私がは、どのように私は、単一のインスタンスは、アプリケーション

Application.Restart();

を使用して、毎朝午前2時に再起動したアプリケーションを持っていますまたは実行中のインスタンス。

私は

bool IsOwned; 
Mutex m = new Mutex(true, Name, out IsOwned); 
if (!IsOwned) 
     Environment.Exit(0); 

を使用してインスタンスの数を制限しようとしたが、これは最近、停止のインスタンスがまだ目に見える...か、少なくともそれは私の解釈だと通りであった何らかの理由として動作しませんでしたアプリケーションは再起動しませんでした。

どこが間違っていますか?

答えて

3

アプリケーション終了イベントで、mutexを解放して閉じてしまう方法を確認してください。

2

まずオフ...なぜ毎日アプリを再起動する必要がありますか?

私は毎日午前2時に自分自身を再起動するアプリよりも優れたソリューションを推測しています。

たとえば、コメントに記載されているように、メモリリークが発生している可能性があります。アドレッシングはあなたの努力に集中するより良い場所かもしれません。メモリリークを避けるために前もってアプリケーションを再起動することは、自分自身やハックを含むほとんどのプログラマに考えられます。

+1

質問とは何が関係していますか?実際、私は毎日午前2時に再開したいと思っています。 – Brad

+0

なぜ重要なのですか?そして、私は、ほとんどの人が最初に思うことが気になります。 –

+2

@ブラッド - 理由は重要です(ここでの他の質問と同様に)時には、根本的な問題を解決して表面問題を解決することができます。質問は完全に正当なものですが、実際の回答ではなくコメントに投稿している可能性があります。 – AllenG

2

私は過去にこの問題に遭遇しました。問題は、実行中のインスタンスがシャットダウンするミューテックスが、2番目のインスタンスのミューテックスが解放される前に解放されていないことです。これを解決するために、私がやったことは、コントロールをメインフォームに戻し、再起動の指示を与える手段を提供しました。再起動のシャットダウン部分が終了以外のタスクを実行する必要はありませんでした。

3

多分、複数のスレッドを使用していますか?バックグラウンドスレッドをシャットダウンしないと、Application.Restartが呼び出されてもプロセスが実行されたままになります。

この動作を示す以下のコードを貼り付けました。これを見るには、以下のコードでテストプロジェクトをコンパイルして実行します。 (フォームにボタンを1つ置き、以下のコードで定義したクリックハンドラを割り当てる必要があります)。

タスクマネージャを起動し、[プロセス]タブに移動し、PID(プロセスID)列をビューに追加してください。

ボタンをクリックするたびに、アプリケーションは再起動しますが、(プロセスが閉じられていないバックグラウンドスレッドのために)古いプロセスがまだメモリに掛かっているのがわかります。

これはあなたの問題であり、それを訂正するための最良の方法は、(たとえブールフラグが行います)、あなたのバックグラウンドスレッドにチェックのいくつかの種類を置くことであると仮定すると
 

    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      // start a background thread that will never be exited. 
      System.Threading.Thread thread = new System.Threading.Thread(delegate() { while (true) System.Threading.Thread.Sleep(1000); }); 
      thread.Start(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      Application.Restart(); 
     } 
} 
 

。定期的に退出を確認し、アプリがシャットダウンしたら正常に終了します。

注:スレッドのバックグラウンドプロパティをtrueに設定すると、自動的に終了しますが、そうすると、終了時にスレッドが実行している命令を制御することができなくなるため、任意の種類のクリーンアップを実行します。独自のチェックをコード化するのが最善です。

関連する問題