Heim > Backend-Entwicklung > C++ > Wie storniere ich eine Aufgabe. Wait () nach einer Auszeit in C#?

Wie storniere ich eine Aufgabe. Wait () nach einer Auszeit in C#?

Mary-Kate Olsen
Freigeben: 2025-01-27 22:16:13
Original
603 Leute haben es durchsucht

How to Cancel a Task.Wait() After a Timeout in C#?

Die Methode zum Abbrechen der Aufgabe.wait () in C#

Starten Sie in diesem Code

mit einer neuen Thread mit einer Meldungspumpe und führen Sie die Aufgabe

im Thread aus. Warten Sie dann, bis die Aufgabe im Haupt -Thread den Haupt -Thread blockiert, bis die Aufgabe abgeschlossen ist. MessageLoopWorker.Run DoWorkAsync Um die Aufgabe nach der Zeit zu kündigen, können Sie die

-Klasse verwenden. Mit

ermöglicht es Ihnen, die Anforderung von einem Thread zu einem anderen zu stornieren. CancellationToken CancellationToken Folgendes ist die Methode zum Ändern des Code, um die Aufgabe nach der Überstunden zu stornieren:

In diesem Code erstellen wir eine
<code class="language-csharp">private Uri GetFinalUrl(PortalMerchant portalMerchant)
{
    SetBrowserFeatureControl();
    Uri finalUri = null;
    if (string.IsNullOrEmpty(portalMerchant.Url))
    {
        return null;
    }
    Uri trackingUrl = new Uri(portalMerchant.Url);

    // 创建一个 CancellationTokenSource。
    using (CancellationTokenSource cancellationTokenSource = new CancellationTokenSource())
    {
        // 设置 5 秒的超时时间。
        using (Timer timer = new Timer(state => cancellationTokenSource.Cancel(), null, 5000, Timeout.Infinite))
        {
            try
            {
                // 使用 CancellationToken 启动任务。
                var task = MessageLoopWorker.Run(DoWorkAsync, cancellationTokenSource.Token, trackingUrl);

                // 等待任务完成。
                task.Wait(cancellationTokenSource.Token);

                // 如果任务成功完成,获取结果。
                if (!string.IsNullOrEmpty(task.Result?.ToString()))
                {
                    return new Uri(task.Result.ToString());
                }
            }
            catch (OperationCanceledException)
            {
                // 任务被取消。
            }
            catch (AggregateException ex)
            {
                // 处理任务中的其他异常
                foreach (var innerException in ex.InnerExceptions)
                {
                    // Log or handle inner exception appropriately
                    Console.WriteLine($"Inner Exception: {innerException.Message}");
                }
            }
        }
    }

    // 如果任务被取消或失败,则返回 null。
    return null;
}</code>
Nach dem Login kopieren
und geben es an die

-Methode weiter. Wir haben auch einen Timer festgelegt, um das Token nach 5 Sekunden zu stornieren. Wenn die Aufgabe vor der Überstunden erfolgreich abgeschlossen ist, erhalten wir das Ergebnis. Wenn die Aufgabe abgebrochen wird, werden wir CancellationTokenSource erfassen. Schließlich verwenden wir Anweisungen, um die Ressourcen CancellationToken und MessageLoopWorker.Run zu veröffentlichen, um sicherzustellen, dass die Ressourcen ordnungsgemäß verarbeitet werden. Darüber hinaus wird eine OperationCanceledException -Behandlung hinzugefügt, um andere Anomalien zu erfassen und umzugehen, die in der Mission using auftreten können. CancellationTokenSource Timer Diese verbesserte Version verwendet AggregateException Anweisungen für die ordnungsgemäße Ressourcenverwaltung, um Ressourcenlecks zu verhindern

Das obige ist der detaillierte Inhalt vonWie storniere ich eine Aufgabe. Wait () nach einer Auszeit in C#?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage