7
public void threadMethod() 
{
    try
    {
        // do something
    }    
    catch (ThreadInterruptedException e)
    {
        Console.WriteLine("[Net]", role, "Thread interrupted.");
        n.CloseConnection();
    }
    finally
    {
        if (isAutenticated == false)
        {
            n.CloseConnection();
        }

        Dispatcher.Invoke(addMessage, "Network connection searching was disabled.");
        DebuggerIX.WriteLine("[Net]", role, "Finished");
        Dispatcher.Invoke(threadStoppedDel);
    }
}

メソッドthreadMethodはSystem.Threading.Threadを介して実行されます。スレッドはいつでも中断される可能性があるため、例外ThreadInterruptedExceptionが finally ブロックでスローされる可能性がありますよね? ブロックを最後に try-catch で再度囲む必要がありますか?

ありがとう!

4

1 に答える 1

7

Thread.Interruptを手動で呼び出すことによってスレッドが中断されると、スレッド中断例外がスローされます。Windows 自体は、そのメソッドを使用してスレッドを中断しません。一般に、スレッドがいつ割り込みシグナルを送信するかを制御するのはプログラムです (常にではありません)。割り込みシグナルは何らかのフロー制御に使用できるため、通常、連続して 2 回送信されることはありません。

ThreadInterruptedException は、中断されたスレッドでスローされますが、スレッドがブロックされるまでスローされません。スレッドがブロックされない場合、例外はスローされないため、スレッドは中断されることなく完了する可能性があります。

スレッドがスリープしたり、他のオブジェクトを待機したりしない場合 (WaitSleepJoin 状態に入る)、例外がスローされることはありません。

あなたが持っているようにスレッドを保護することは受け入れられるはずです。ThreadAbortException もスローされる可能性があることを忘れないでください。それらは、より広範囲に渡って、より頻繁にスローされる可能性があります (アプリケーションのシャットダウンなど)。

于 2010-07-22T21:23:19.880 に答える