2017-07-09 8 views
3

私はWinForms C#プログラムを作成しています。フォームを閉じるときのC#ArgumentOutOfRangeException

メインフォーム以外のすべてのフォーム(FrmMain)を閉鎖しようとしています。

メインフォームを非表示にする必要があります。

私はこれを2つの形式を開いて作成しました。 1つは私のメインフォームで、もう1つはShowDialog()メソッドで表示された別のフォームです。

このコードを自分のマシン上で実行すると、すべてのフォームを適切に閉じる必要があるようです。何らかの理由で、ブレークポイントを設定せずにこの特定のコードを実行すると、変数i-1になるため、ArgumentOutOfRangeExceptionが返されます。私がブレークポイントを設定し、コードの各部分をゆっくりと進めるとうまく動作します。

私はi >= 0の条件があるので、i-1に到達するためにforループが途中まで続くことは意味がありません。 iのインデックスは、私がブレークポイントを使用していないとき-1になりますが、私は、ブレークポイントを使用して、個別にループの各行をステップ実行していたときに0になる理由

誰かが私に説明できますか?

これを修正するにはどうすればよいですか?

ありがとうございます。

  for (int i = Application.OpenForms.Count - 1; i >= 0; i--) 
      { 
       if (Application.OpenForms[i] is FrmMain) 
       { 
        Application.OpenForms[i]?.BeginInvoke((MethodInvoker)delegate 
        { 
         Application.OpenForms[i]?.Hide(); 
        }); 
       } 
       else 
       { 
        Application.OpenForms[i]?.BeginInvoke((MethodInvoker)delegate 
        { 
         Application.OpenForms[i]?.Dispose(); 
        }); 
       } 
      } 

編集:私は例外ArgumentOutOfRangeExceptionを取得防止

方法は、のためにループ内で別の変数を追加することです。 これは私が変更したコードです。条件がfalseの場合

  for (int i = Application.OpenForms.Count - 1; i >= 0; i--) 
      { 
       int i1 = i; 
       if (Application.OpenForms[i] is FrmMain) 
       { 
        Application.OpenForms[i]?.BeginInvoke((MethodInvoker)delegate 
        { 
         Application.OpenForms[i1]?.Hide(); 
        }); 
       } 
       else 
       { 
        Application.OpenForms[i]?.BeginInvoke((MethodInvoker)delegate 
        { 
         Application.OpenForms[i1]?.Dispose(); 
        }); 
       } 
      } 
+2

検索用語「C#の閉鎖のための」 –

+0

、そしてあなたは、このコードを呼び出すん回数:

あなたはここで撮影した変数を知ることができますか? –

+0

@AfshinAghazadeh新しいスレッドでクラス内で一度しか呼び出されない – Ben

答えて

1

は基本的に、forループのみiは、それが停止する前-1に到達するために持っている意味、終了します。良い説明を提供するには、 When does iteration variable in for loop incrementを参照してください。

Dispose()があるとき、それは-1するiのために完全に可能だあなたは、本質的に(それが実行を遅らせることができます意味する)別のスレッドに実行を移動BeginInvokeを、使用している事実と合わせて、そしてiが捕獲変数でありますと呼ばれる。

ブレークポイントがあると、メインスレッドの実行が遅くなり、別々のスレッドがすべて予想通りに実行されるため、問題は見えなくなるでしょう。 What are 'closures' in .NET?

+1

私は「それは完全に可能です」とはここでは十分に強いとは思わない。それが起こっていることは確かだと思います。 – Enigmativity

+0

ありがとうございます。それは私を助けた – Ben

関連する問題