[C#] 빈 try 블록으로 try {} finally {}를 사용하는 이유는 무엇입니까?

나는 눈치 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 호출을 방지합니다. Thread.Abort의 MSDN 페이지에는 “스레드가 중단되기 전에 실행되지 않은 최종 블록이 실행됩니다”라고 말합니다. 따라서 누군가 스레드에서 중단을 호출하여 스레드가 중간에 중단 된 경우에도 처리가 완료되도록하려면 모든 코드를 finally 블록에 배치 할 수 있습니다 (대안은 “catch”블록에 코드를 작성하는 것임). “시도”가 중단에 의해 중단되기 전의 위치를 ​​결정하고 원하는 경우 거기서 계속 진행하십시오).


답변

이것은 Thread.Abort프로세스 중단 을 막기 위한 것입니다. 이 방법에 대한 설명서 는 다음과 같이 말합니다.

스레드가 중단되기 전에 실행되지 않은 finally 블록이 실행됩니다.

오류에서 성공적으로 복구하려면 코드 자체를 정리해야합니다. C #은 C ++가 없기 때문에 – 스타일의 소멸자를, finally그리고 using블록은 그러한 정리를 보장하는 신뢰할 수있는 유일한 방법이 신뢰성있게 수행합니다. using컴파일러가 블록을 이것으로 바꾼다는 것을 기억하십시오 :

try {
    ...
}
finally {
    if(obj != null)
        ((IDisposable)obj).Dispose();
}

.NET 1.x에서 finally블록이 중단 될 가능성이있었습니다 . 이 동작은 .NET 2.0에서 변경되었습니다.

또한 빈 try블록은 컴파일러에 의해 최적화되지 않습니다.


답변