Heim > Backend-Entwicklung > C++ > Wie kann ich asynchrone Aufgaben in WinRT ordnungsgemäß abbrechen?

Wie kann ich asynchrone Aufgaben in WinRT ordnungsgemäß abbrechen?

Susan Sarandon
Freigeben: 2025-01-26 12:41:11
Original
220 Leute haben es durchsucht

How to Properly Cancel Asynchronous Tasks in WinRT?

Der richtige Weg, asynchrone WinRT-Aufgaben abzubrechen

In Windows 8 WinRT stellen Aufgaben einen Mechanismus zum Ausführen asynchroner Vorgänge bereit. Der Umgang mit Aufgabenabbrüchen kann jedoch schwierig sein.

Bedenken Sie den folgenden Code:

<code class="language-csharp">private async void TryTask()
{
    CancellationTokenSource source = new CancellationTokenSource();
    source.Token.Register(CancelNotification);
    source.CancelAfter(TimeSpan.FromSeconds(1));
    var task = Task<int>.Factory.StartNew(() => slowFunc(1, 2), source.Token);

    await task;

    if (task.IsCompleted)
    {
        MessageDialog md = new MessageDialog(task.Result.ToString());
        await md.ShowAsync();
    }
    else
    {
        MessageDialog md = new MessageDialog("Uncompleted");
        await md.ShowAsync();
    }
}

private int slowFunc(int a, int b)
{
    string someString = string.Empty;
    for (int i = 0; i < 1000000; i++)
    {
        someString += i.ToString();
    }
    return a + b;
}</code>
Nach dem Login kopieren

Obwohl die Methode CancelNotification aufgerufen wird, wird die Aufgabe weiterhin im Hintergrund ausgeführt und abgeschlossen. Um die Aufgabe bei einem Abbruch vollständig zu stoppen, befolgen Sie bitte diese Richtlinien:

  • CancellationToken übergeben: Übergeben Sie CancellationToken an jede Methode, die Stornierung unterstützt.
  • CancellationToken regelmäßig überprüfen: Diese Methode muss regelmäßig CancellationToken überprüft werden.

Der verbesserte Code lautet wie folgt:

<code class="language-csharp">private async Task TryTask()
{
    CancellationTokenSource source = new CancellationTokenSource();
    source.CancelAfter(TimeSpan.FromSeconds(1));
    Task<int> task = Task.Run(() => slowFunc(1, 2, source.Token), source.Token);

    // (取消的任务在等待时会引发异常)。
    await task;
}

private int slowFunc(int a, int b, CancellationToken cancellationToken)
{
    string someString = string.Empty;
    for (int i = 0; i < 1000000; i++)
    {
        cancellationToken.ThrowIfCancellationRequested(); // 检查取消请求
        someString += i.ToString();
    }
    return a + b;
}</code>
Nach dem Login kopieren

Wenn eine Aufgabe während der Ausführung abgebrochen wird, wird die Aufgabe mit diesen Änderungen vollständig abgebrochen und während des Wartens wird eine Ausnahme ausgelöst.

Das obige ist der detaillierte Inhalt vonWie kann ich asynchrone Aufgaben in WinRT ordnungsgemäß abbrechen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
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