Heim >Backend-Entwicklung >C++ >Wie kann ich einen generischen Timeout-Mechanismus für die Codeausführung in C# implementieren?

Wie kann ich einen generischen Timeout-Mechanismus für die Codeausführung in C# implementieren?

Susan Sarandon
Susan SarandonOriginal
2025-01-23 12:01:121033Durchsuche

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

C# Universal Code Execution Timeout-Mechanismus: Eine vollständige Anleitung

Bei der Softwareentwicklung ist die Kontrolle der Ausführungszeit von Codeblöcken von entscheidender Bedeutung, insbesondere wenn es um unzuverlässige oder zeitaufwändige externe Abhängigkeiten wie API-Aufrufe oder Datenbankabfragen geht. Dazu ist eine gemeinsame Methode zum Festlegen von Zeitüberschreitungen für einzelne Codezeilen erforderlich.

Implementieren Sie einen universellen Timeout-Mechanismus

Der Kern des Aufbaus eines universellen Timeout-Mechanismus besteht darin, lang laufenden Code zu beenden und mögliche Fehler abzufangen. Hierfür können wir eine mehrschichtige Lösung anwenden:

  • Wrapped Delegate: Erstellt einen Delegaten, der den Zielcode erfasst und Zugriff auf das Thread-Handle bereitstellt.
  • Timeout-Ausführungsmethode: Erstellt eine Methode (z. B. CallWithTimeout), die einen Vorgang und eine Timeout-Dauer als Eingabe empfängt. Diese Methode startet die Codeausführung in einem separaten Thread und hängt einen Wrapping-Delegaten an, um den Fortschritt zu verfolgen.
  • Thread-Beendigung: Beenden Sie bei Zeitüberschreitung den Thread, der für Code mit langer Laufzeit verantwortlich ist, und werfen Sie TimeoutException aus.

Praktische Bedienung

Im Folgenden sind die spezifischen Implementierungsdetails aufgeführt:

<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>

Diese Implementierung ermöglicht Ihnen die Ausführung von Code mit genau definierten Zeitüberschreitungen und bietet gleichzeitig Flexibilität und elegante Kontrolle über die Ausführung.

Das obige ist der detaillierte Inhalt vonWie kann ich einen generischen Timeout-Mechanismus für die Codeausführung in C# implementieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn