>백엔드 개발 >C++ >C#에서 코드 실행을 위한 일반 시간 초과 메커니즘을 어떻게 구현할 수 있습니까?

C#에서 코드 실행을 위한 일반 시간 초과 메커니즘을 어떻게 구현할 수 있습니까?

Susan Sarandon
Susan Sarandon원래의
2025-01-23 12:01:121035검색

How Can I Implement a Generic Timeout Mechanism for Code Execution in C#?

C# 범용 코드 실행 시간 제한 메커니즘: 전체 가이드

소프트웨어 개발에서는 코드 블록의 실행 시간을 제어하는 ​​것이 중요하며, 특히 API 호출이나 데이터베이스 쿼리와 같이 신뢰할 수 없거나 시간이 많이 걸리는 외부 종속성을 처리할 때 더욱 그렇습니다. 이렇게 하려면 단일 코드 줄에 대한 시간 제한을 설정하는 일반적인 방법이 필요합니다.

범용 시간 초과 메커니즘 구현

범용 시간 초과 메커니즘 구축의 핵심은 장기 실행 코드를 종료하고 발생할 수 있는 오류를 차단하는 것입니다. 이를 위해 계층화된 솔루션을 채택할 수 있습니다.

  • 래핑된 대리자: 대상 코드를 캡처하고 스레드 핸들에 대한 액세스를 제공하는 대리자를 만듭니다.
  • 타임아웃 실행 메서드: 작업과 타임아웃 기간을 입력으로 받는 메서드(예: CallWithTimeout)를 만듭니다. 이 메서드는 별도의 스레드에서 코드 실행을 시작하고 진행 상황을 추적하기 위해 래핑 대리자를 연결합니다.
  • 스레드 종료: 시간 초과 시 장기 실행 코드를 담당하는 스레드를 종료하고 TimeoutException을 발생시킵니다.

실습

구체적인 구현 내용은 다음과 같습니다.

<code class="language-csharp">class Program
{
    static void Main(string[] args)
    {
        // 设置 6000 毫秒(6 秒)的超时
        CallWithTimeout(FiveSecondMethod, 6000);

        // 设置 4000 毫秒(4 秒)的超时
        CallWithTimeout(FiveSecondMethod, 4000);
    }

    static void FiveSecondMethod()
    {
        Thread.Sleep(5000);
    }
}

static void CallWithTimeout(Action action, int timeoutMilliseconds)
{
    Thread threadToKill = null;

    Action wrappedAction = () =>
    {
        threadToKill = Thread.CurrentThread;
        try
        {
            action();
        }
        catch (ThreadAbortException ex)
        {
            Thread.ResetAbort(); // 避免强制终止
        }
    };

    IAsyncResult result = wrappedAction.BeginInvoke(null, null);

    if (result.AsyncWaitHandle.WaitOne(timeoutMilliseconds))
    {
        wrappedAction.EndInvoke(result);
    }
    else
    {
        threadToKill.Abort();
        throw new TimeoutException();
    }
}</code>

이 구현을 사용하면 실행에 대한 유연성과 우아한 제어 기능을 제공하면서 잘 정의된 시간 초과로 코드를 실행할 수 있습니다.

위 내용은 C#에서 코드 실행을 위한 일반 시간 초과 메커니즘을 어떻게 구현할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.