programing

빈 시도 블록에서 {} 시도를 마지막으로 {} 시도를 사용하는 이유는 무엇입니까?

powerit 2023. 5. 8. 22:30
반응형

빈 시도 블록에서 {} 시도를 마지막으로 {} 시도를 사용하는 이유는 무엇입니까?

에서 알아차렸습니다.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/ 에서:

이 방법은 스레드를 방지합니다.처리를 중단하는 호출을 중단합니다.스레드의 MSDN 페이지입니다.Abort는 "실행되지 않은 블록은 스레드가 중단되기 전에 최종적으로 실행됩니다."라고 말합니다.그래서 당신의 스레드에서 중단을 부르는 누군가에 의해 중간에 당신의 스레드가 중단되더라도 당신의 처리가 완료되도록 보장하기 위해,모든 코드를 마지막 블록에 배치할 수 있습니다(대안은 "catch" 블록에 코드를 작성하여 "try"가 Abort에 의해 중단되기 전의 위치를 결정하고, 원한다면 거기서 계속 진행하는 것입니다).

이를 방지하기 위한 것입니다.Thread.Abort프로세스 중단 방법에 대한 설명서는 다음과 같습니다.

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

오류로부터 성공적으로 복구하기 위해서는 코드 자체를 정리해야 하기 때문입니다.C#에는 C++ 스타일의 디스트럭터가 없기 때문에,finally그리고.using블록은 이러한 정리를 안정적으로 수행할 수 있는 유일한 신뢰할 수 있는 방법입니다.그 것을 기억하라.using블록은 컴파일러에 의해 다음과 같이 바뀝니다.

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

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

게다가, 비어있습니다.try블록은 컴파일러에 의해 최적화되지 않습니다.

언급URL : https://stackoverflow.com/questions/2186101/why-use-try-finally-with-an-empty-try-block

반응형