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>
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
an jede Methode, die Stornierung unterstützt. 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>
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!