2016-05-11 7 views
-1

GhostフォームでWinFormsに問題があり、フォームにthis.Close()があり、closeコマンドを送信すると消えますがメモリに残っています。適切に私は、このメソッドを作成し、これらのフォーム閉じるには:C#APPのGhostフォーム

public static void CloseAllForms() 
     { 
      //foreach (frmBase item in Application.OpenForms) 
      //{ 
      // if (!item.Name.Equals("frmVinheta") && !item.Name.Equals("frmPrincipal")) 
      // { 
      //  item.Dispose(); 
      //  item.Close();      

      // } 
      //} 

      for (int i = Application.OpenForms.Count - 1; i > 1; i--) 
      { 
       Form1 f1 = Application.OpenForms[i] as Form1; 

       Application.OpenForms[i].Dispose(); 
       Application.OpenForms[i].Close(); 
       Application.OpenForms[1].RemoveOwnedForm(Application.OpenForms[i]); 
      } 

      GC.Collect(); 
     } 

をしかし、FRMは、彼がOpenFormsリスト、メモリに近いままていない私のdispositivesのすべては、それがゴーストフォームにイベントだ送信、所有者の負け。

誰かが私がここでテストできる他のことを知っていますか?

答えて

1

他のプロセスでは、アプリケーションでハンドルを開いている可能性があります。手動で閉じることはできますか?そうでない場合は、Form.Dispose()を試してください。可能であれば、フォームリファレンスに問題があります。おそらく、外部クラスのフォームを誤って閉じようとしているのでしょうか?コードを確認し、thisがあなたのフォームを参照していることを確認してください。そうであれば、Form.Close()またはForm.Dispose()にブレークポイントを置き、実際に実行されているかどうか確認してください。表示されていない場合は、メソッドの上位をチェックして、実行を停止したかどうかを確認します。それが問題なのかどうかはわかりません。

EDIT:

あなたはGARBAGECOLLECT前にnullにフォームを設定する必要があります。しかし、すべてのフォームを閉じるメソッドの代わりに、おそらくusingステートメントを実装しますか? Like So:

using (var frm = new Form2()) 
{ 
    //Form2 instance exists here 
} 
//Form2 instance gets Closed and disposed properly here 
+0

アプリケーションの他のプロセスのハンドルを持っていない、フォームは私には表示されません、彼は視覚的に閉じていたが、私はOpenFormsリストでそれを見ることができるデバッグ。 'this.Close()'は私の視界からフォームを削除するように機能しますが、削除しないでください。アプリケーションは正常に動作しますが、キーボードストレステストを開いてフォームを開いたり、フォームを閉じたり、フォームで作業したりすると、メモリにまだ開いている1つまたは複数のメッセージフォーム(このメッセージはまだ8秒間閉じています) – JonesVG

+0

ああ、まだメモリを使用しているのですか? – RhysO

+0

彼はまだメモリにいますが、私には現れません。彼はまだアクティブフォームのリストにあります。 'Application.OpenForms' – JonesVG

1

あなたのロジックはちょっと混乱しているようです。私はそれを指摘して、コメントを追加するつもりです:

 for (int i = Application.OpenForms.Count - 1; i > 1; i--) 
     { 
      // Here you are obtaining a reference to the form, but not using it 
      Form1 f1 = Application.OpenForms[i] as Form1; 

      // Here you are trying to Dispose, but then Close (instead of the other way around 
      // I'm not sure why you'd do this unless you don't have cleanup being done at time of close. 
      Application.OpenForms[i].Dispose(); 
      Application.OpenForms[i].Close(); 
      // It looks like your first form is the owner of every other form in the collection. 
      // If possible, you may want to rethink this for clarity's sake. 
      Application.OpenForms[1].RemoveOwnedForm(Application.OpenForms[i]); 
     } 

私はあなたがしてCloseDispose、フォームに欠けていると仮定します。これを行うことも可能である。

 for (int i = Application.OpenForms.Count - 1; i > 1; i--) 
     { 
      Form1 f1 = Application.OpenForms[i] as Form1; 

      f1.Close(); 
      f1.Dispose(); 
      Application.OpenForms[1].RemoveOwnedForm(f1); 
     } 
  • は、完全な閉鎖を妨げる子フォームではありますか?これには、オープンスレッド、サブスクライブされたイベント(時には変わっている可能性があります)、Cancel = Trueコール、this.Hide()などがあります。その場合は、スレッドを終了し、手動で購読したイベントから退会し、フォームが生き残ってしまう可能性のある他の側面を処理してください。
  • Disposeメソッドを使用している場合は、フォームを有効に保つことができるインスタンス化されたものを完全にオブジェクトクリーンアップしてください。
0

(OPの代わりに掲示される)。

私はいくつかのフラグと現在の非幽霊のフォームに私のdispositivesを指す方法でそれを解決しました。あなたのお友達のおかげで、すべての幽霊のフォームが今働いています。