web-dev-qa-db-ja.com

VB.NET-割り込みフォームループと終了フォーム

私は無限ループを通過してデータを処理するフォームを持っています。フォームを「閉じる」ボタンをクリックすると、フォームを閉じても処理が続行されます。フォームを完全に終了してループステートメントから抜け出し、新しいフォームを開きます。

これがフォームを閉じるために使用しているコードです

frmMain.Close()
frmMain.Dispose()

注:スレッドは使用していません。これは単純な VB.NET アプリケーションです。メインのスタートアップフォームを閉じません。

60
Phil

これを行う「正しい」方法は、実際にはバックグラウンドワーカースレッドを使用することです。ただし、これはバックグラウンドワーカースレッドがなくても機能します。

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

Private keepLoopAlive As Boolean

次に、処理ループを次のように記述します。

keepLoopAlive = True

Do While keepLoopAlive 

    (your code that loops here)

    DoEvents

Loop

次に、閉じるイベントで次の操作を行います。

keepLoopAlive = False
Me.Close()

これにより、ループが最初のチャンスで終了し、フォームが閉じます。

このコードはIDEではなく、メモリから作成したため、タイプミスがある可能性があります。

84
Panafe

私は 。NET 開発者ではないので、これは有効ではない可能性がありますが、無限ループを実行している場合は、ループを開始するたびに、何らかのブール値でループが有効であることを確認します、失敗した場合はループから抜けます。

フォームを閉じるときに、ブール値falseを設定するとドロップされ、ループを待機して再起動する外部ループを作成するか、関数全体をもう一度再起動することができます。

12
Craig