2011-01-25 10 views
2

を閉じようとしたとき、私は近いWinFormsのアプリケーションがフリーズ機能実行した後、コードWinフォームは、私はそれを

private void btnClose_Click(object sender, System.EventArgs e) 
{ 
    Close(); 
} // btnClose_Click 

を以下しているフリーズ。なぜそれが起こることができますか?

私は.NET 2.0を使用して、私は、Windows 7の下で実行VS2005

EDIT:

私は、デバッガで一時停止を押した後、私は

private void MainForm_Closing(object sender, System.ComponentModel.CancelEventArgs e) 
{ 
    // GUI 
    if (FScannerThread_Running) 
    { 
    FScannerThread_Running = false; 
    FScannerThread.Join(); 
    } 
} 

に来て、それはFScannerThread.Join();内の任意のアイデアを積み重ね私はそれを殺すことができますか?

+1

このコードだけでは、何が起こるかを知ることは不可能です。他に何があるのか​​さらに説明できますか? – Ikke

+1

これ以上のコードが必要です。これは孤立してうまく動作します。 –

+0

'Form_Closing'または' Form_Closed'イベントで何か起こっていますか? – Shimrod

答えて

5

のためにそれを置き換えることができ、結果がfalseの場合、あなたのスレッドAbort()bool Thread.Join(int milliseconds)オーバーロードを使用し、。 (あなたが例えば解放する何かを持っている場合)が正常に終了するために、あなたのスレッドでThreadAbortExceptionをキャッチする必要があり

private void MainForm_Closing(object sender, System.ComponentModel.CancelEventArgs e) 
{ 
    // GUI 
    if (FScannerThread_Running) 
    { 
     FScannerThread_Running = false; 
     if (!FScannerThread.Join(1000)) // Give the thread 1 sec to stop 
     { 
      FScanner.Abort(); 
     }  
    } 
} 

注意。

4

フリーズされている場合は、デバッグメニューで一時停止(すべてブレーク)を呼び出します。アプリの別のスレッドがハングアップする可能性があります。 ここのプラットフォームは関係ありません。ときには、マルチスレッドのアプリケーションを持っていて、あるスレッドで状態が壊れていたり、そのようなことがあった場合に起こります。

1

近い機能で、あなたは、単にアプリを終了したい場合は、あなただけの

Application.Exit(); 
+0

'Application.Exit();'アプリケーションを実行している他のスレッドが正しく終了する必要がある場合でも、スレッドをブロックしていますか? –

2

ほとんどの場合、それは両方:)

だ、まだあなたのケースでは

を実行しているあなたはどちらか FormClosingまたはFormClosedイベント

  • 別スレッドで行うのいずれか

    1. 何か理想的には、可能であれば、スレッドメソッドを書き換えて、中絶を適切に考慮します(for同期プリミティブの1つを使用することによって)。そうでない場合は、ThreadインスタンスのAbortメソッドを使用することができますが、推奨される方法ではありません。

  • 関連する問題