Wie kann ich ein timeout für eine Asynchrone Funktion, die nicht akzeptieren, eine Kündigung token?
Habe ich meine web-Anfragen behandelt, die von diesem code;
Response = await Client.SendAsync(Message, HttpCompletionOption.ResponseHeadersRead, CToken);
Zurückgibt, die nach dem Antwort-Header gelesen werden, und bevor der Inhalt gelesen. Wenn ich diese Zeile um den Inhalt...
return await Response.Content.ReadAsStringAsync();
Ich möchte in der Lage sein, um es zu stoppen nach X Sekunden. Aber es nicht akzeptieren eine Stornierung token.
- FYI, wenn man sich mit timeouts auf IDisposable Sie wahrscheinlich wollen, schau mal hier: Async-Netzwerk-Operationen nie zu Ende bringen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Während Sie kann verlassen sich auf
WithCancellation
für die Wiederverwendung Zwecke, eine einfachere Lösung für ein timeout (was nicht werfenOperationCanceledException
) wäre eine timeout-task mitTask.Delay
und warten auf die erste Aufgabe zu vervollständigen mitTask.WhenAny
:Oder, wenn Sie wollen, um eine Ausnahme für den Fall gibt es ein timeout, anstatt einfach wieder den default-Wert (also
null
):Und die Verwendung wäre:
Haben Sie einen Blick auf Wie kündige ich unkündbaren async-Operationen?. Wenn Sie wollen einfach nur die
await
zu beenden, während die Anfrage im hintergrund läuft, können Sie den AutorWithCancellation
- Erweiterung-Methode. Hier wird es reproduziert aus dem Artikel:Es im wesentlichen verbindet die ursprüngliche Aufgabe mit einer Aufgabe, die akzeptiert eine Kündigung token und wartet dann beide Aufgaben mit
Task.WhenAny
. So, wenn Sie kündigen, dieCancellationToken
die secodn Aufgabe storniert wird, aber das original hält. Solange Sie kümmern sich nicht darum, dass Sie diese Methode verwenden.Können Sie es verwenden, wie diese:
Update
Können Sie auch versuchen, Sie zu entsorgen die Antwort als Teil der Widerrufsbelehrung.
Nun so brechen Sie den token, der
Content
Objekt entsorgt werden.Thread.Abort
wie in dieser Antwort stackoverflow.com/a/21715122/1239433, aber Sie können den Aufruf einer synchronen version der Funktion innerhalbTask.Run
um es zu tun.Response.Content
und/oder dieResponse
wenn die cancel-token signalisiert wird.Da gibt eine Aufgabe, können Sie
Wait
für die Aufgabe, die im wesentlichen äquivalent zu einem timeout: