Heim >Backend-Entwicklung >C++ >Wie kann ich einen generischen Timeout-Mechanismus in C# implementieren?

Wie kann ich einen generischen Timeout-Mechanismus in C# implementieren?

Susan Sarandon
Susan SarandonOriginal
2025-01-23 12:21:10883Durchsuche

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

Implementierung eines universellen Timeout-Mechanismus in C#

Eine häufige Anforderung bei der Programmierung besteht darin, Code mit einem bestimmten Timeout ausführen zu können. Dies ist von entscheidender Bedeutung, wenn es um externe Systeme oder Code geht, dessen Fertigstellung möglicherweise zu lange dauert. Die Implementierung eines gemeinsamen Timeout-Mechanismus ermöglicht ein konsistentes Verhalten in der gesamten Codebasis und stellt sicher, dass nicht reagierender Code angemessen gehandhabt wird.

In diesem Fall besteht das Ziel darin, eine generische Methode zu erstellen, die jeden gegebenen Code innerhalb eines bestimmten Timeouts ausführen kann. Die Lösung sollte Situationen, in denen der Code das Zeitlimit überschreitet, ordnungsgemäß bewältigen und einen Mechanismus zum Stoppen seiner Ausführung bereitstellen.

Eine elegante Möglichkeit, dies zu erreichen, ist die Verwendung von Delegaten. Der folgende Codeausschnitt zeigt eine generische Timeout-Methode namens CallWithTimeout, die einen Aktionsdelegaten und einen Timeout-Wert in Millisekunden akzeptiert:

<code class="language-csharp">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>

Bei dieser Methode wird ein separater Thread erstellt, um den angegebenen Vorgang auszuführen. Der Schlüssel zur Steuerung der Ausführung liegt in der Verwendung eines Wrapping-Delegaten, der einen Verweis auf den Thread erfasst. Wenn der Vorgang das Timeout überschreitet, wird der Thread ordnungsgemäß beendet und eine TimeoutException ausgelöst.

Durch die Verwendung dieses universellen Timeout-Mechanismus können Entwickler ihren Code einfach vor nicht reagierenden externen Systemen oder Codeblöcken schützen. Es fördert ein robustes Anwendungsverhalten und verbessert die Behandlung potenzieller Ausnahmen.

Das obige ist der detaillierte Inhalt vonWie kann ich einen generischen Timeout-Mechanismus 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