Ich muss den Aufgabenaufrufen in einer mobilen App eine Zeitüberschreitungsfunktion hinzufügen. Ich habe versucht, dies mithilfe von Task.WhenAny wie unten gezeigt zu beenden.
Zunächst sollten Sie sich bewusst sein, dass sie nicht die CancellationToken
-GetRequestAsync
vorbei, sie ist nicht wirklich die Anfrage abgebrochen wird. Es wird weiter verarbeitet.
Zweitens finde ich Ihren Code ziemlich seltsam, da es in seinem aktuellen Zustand zwei Timeouts möglich ist: die Task.Delay
vervollständigen kann, oder die CancellationToken
signalisiert werden kann. Eine davon (Task.Delay
) ist eine normale Aufgabenerfüllung und die andere (CancellationToken
) ist eine echte Löschung.
Wenn die CancellationToken
ist Ihr Timeout, dann können Sie die WaitAsync
Methode aus meiner Nito.AsyncEx.Tasks
Bibliothek verwenden:
Task task = restService.GetRequestAsync(articleAdr, articleParams);
await task.WaitAsync(cts.Token);
var result = await task;
Wenn die CancellationToken
eine vom Nutzer gewünschte Stornierung ist, und dass die Task.Delay
ist die Timeout Sie anwenden möchten, dann würde ich empfehlen, Ihre Timeout als eine andere Art von Annullierung Modellierung:
Task task = restService.GetRequestAsync(articleAdr, articleParams);
using (var timeoutCts = CancellationTokenSource.CreateLinkedTokenSource(cts.Token))
{
timeoutCts.CancelAfter(1000);
await task.WaitAsync(timeoutCts.Token);
}
var result = await task;
Wenn Sie nicht verwenden möchten Nito.AsyncEx.Tasks
, dann die beste Wahl ist wahrscheinlich so etwas wie diese (unter der Annahme Task.Delay
als Timeout bestimmt ist und CancellationToken
ist ein Benutzer Stornierungsanfrag):
Task task = restService.GetRequestAsync(articleAdr, articleParams);
var completed = await Task.WhenAny(task, Task.Delay(1000, cts.Token));
if (completed != task)
throw new OperationCanceledException();
var result = await task;