1. ホーム
  2. c#

[解決済み】空のtryブロックでtry {} finally {}を使用するのはなぜですか?

2022-04-03 23:15:06

質問

で気づいたのですが System.Threading.TimerBase.Dispose() メソッドには try{} finally{} ブロックがありますが try{} は空です。

を使うことに価値はあるのでしょうか? try{} finally{} を、空の try ?

http://labs.developerfusion.co.uk/SourceViewer/browse.aspx?assembly=SSCLI&namespace=System.Threading&type=TimerBase。

[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
internal bool Dispose(WaitHandle notifyObject)
{
    bool status = false;
    bool bLockTaken = false;
    RuntimeHelpers.PrepareConstrainedRegions();
    try {
    }
    finally {
        do {
            if (Interlocked.CompareExchange(ref m_lock, 1, 0) == 0) {
                bLockTaken = true;
                try {
                    status = DeleteTimerNative(notifyObject.SafeWaitHandle);
                }
                finally {
                    m_lock = 0;
                }
            }
            Thread.SpinWait(1);
            // yield to processor
        }
        while (!bLockTaken);
        GC.SuppressFinalize(this);
    }

    return status;
}

解決方法は?

から http://blog.somecreativity.com/2008/04/10/the-empty-try-block-mystery/ :

この方法は Thread.Abortの呼び出しで中断される。 を処理します。のMSDNページでは Thread.Abortは、「未実行の が実行される前に、最終ブロックが実行されます。 スレッドが中止される」。そのため 処理を保証する スレッドが終了しても によって途中で中断された 自分のスレッドで Abort を呼び出すと、次のようになります。 すべてのコードを最終的に ブロック(別の方法として catch "ブロックのコードで try "が実行される前にいた場所 によって中断され、そこから先に進むことができます。 ということです。)