2 つのスレッド (メイン スレッドとセカンダリ スレッド) を使用するアプリケーションを閉じると、クロス スレッド例外が発生することがあります。何が起こっているのかと思うと、セカンダリ UI スレッドがまだ実行されている間にメイン UI スレッドが破棄されており、セカンダリ スレッドが UI スレッドで何かを呼び出すことがあるため、クラッシュしています。
FormClosing
イベントのセカンダリ スレッドを手動で閉じる必要はありますか?
情報をありがとう。
2 つのスレッド (メイン スレッドとセカンダリ スレッド) を使用するアプリケーションを閉じると、クロス スレッド例外が発生することがあります。何が起こっているのかと思うと、セカンダリ UI スレッドがまだ実行されている間にメイン UI スレッドが破棄されており、セカンダリ スレッドが UI スレッドで何かを呼び出すことがあるため、クラッシュしています。
FormClosing
イベントのセカンダリ スレッドを手動で閉じる必要はありますか?
情報をありがとう。
マルチスレッド Windows アプリケーションで推奨されるアプローチはMethod Invocation
、別のスレッドで作成されたコントロールを直接操作する代わりに使用することです。この方法では、Cross Thread Exception
. たとえば、テキスト ボックスのテキストを次のように設定できます。
form1.BeginInvoke(new MethodInvoker(()=>textbox1.text = "Hello!"));
詳細については、http: //msdn.microsoft.com/en-us/library/ms171728 (v=vs.85).aspx を参照してください。
セカンダリ スレッドを手動で閉じる必要がありますか?
いいえ、はい。
いいえ、セカンダリ スレッドがバックグラウンド スレッドの場合。セカンダリ スレッドでIsBackgroundプロパティを検査/設定できます。実行中のフォアグラウンド スレッドがなくなると、すべてのバックグラウンド スレッドは CLR によって自動的に停止されます。たとえば、すべての ThreadPool スレッドはバックグラウンド スレッドです。
はい、ただし、セカンダリスレッドで重要なタスクを実行し、突然停止したくない場合です。その場合、適切なロジックを実装してセカンダリ スレッドを停止する必要があります。