2011-01-23 6 views
58

私は、無限ループを通過してデータを処理するフォームを持っています。フォームを「閉じる」ボタンをクリックすると、フォームは閉じられていても処理され続けます。フォームを完全に終了してループステートメントから抜け出し、新しいフォームを開くようにします。私はそれだけの簡単なVB.NETアプリケーションのスレッドを使用していない。ここでVB.NET - フォームのループと終了フォームの割り込み

は、私は、フォーム

frmMain.Close() 
frmMain.Dispose() 

注意を閉じるために使用していたコードです。私はメインのスタートアップフォームを閉じるつもりはありません。

答えて

82

これを行う「正しい」方法は、実際にバックグラウンドワーカースレッドを使用することです。しかしこれはバックグラウンドワーカースレッドを必要とせずに動作します。

フォームクラスで変数を宣言します。

Private keepLoopAlive As Boolean 

その後のようなものであるためにあなたの処理ループを書く:あなたのCloseイベントに続いて

keepLoopAlive = True 

Do While keepLoopAlive 

    (your code that loops here) 

    DoEvents 

Loop 

は行います

keepLoopAlive = False 
Me.Close() 

これは、ループはそれを取得最初のチャンスを終了しますあなたのフォームは閉じなければなりません。

メモこのコードはメモリではなくIDEで記述されているため、タイプミスが発生する可能性があります。

+1

ありがとうございます!私はこれを私のプログラムに実装することをやめました。私はもともと、ループを明確に終了することなくフォームプロセスを突然終了できるかどうかを尋ねていましたが、これは不可能なように聞こえます。 – Phil

+1

ループを終了することなくプロセスを終了することができます。 .NETには少なくとも3つの簡単な方法があります:スレッドの "IsBackground"を "true"に設定し、すべてのフォアグラウンドスレッドを終了するか、Environment.FailFast()またはEnvironment.Exit()を呼び出します。 – codekaizen

+43

すべてのGoogle社員の場合:正しい方法はバックグラウンドワーカーを使用することです。 –

11

私は.NETの開発者ではないので、これは有効ではないかもしれませんが、無限ループを実行していた場合、ループが何らかのブール値で有効であることを開始するたびにチェックします。失敗、ループから脱落。

フォームを閉じるときにブール値をfalseに設定すると、その値は消えてしまいます。ループを待機して再起動する外部ループを使用することもできます。

関連する問題