Ich versuche, die Stornierung auf der Clientseite eines WCF-Aufrufs zu implementieren. Ich habe eine Reihe von Fragen zum Abbrechen des Serverprozesses gesehen, aber das muss ich nicht tun. Ich habe eine Benutzeroberfläche, die auf die Beendigung eines lang andauernden serverseitigen Prozesses reagieren muss.Abbrechen durch Ignorieren eines WCF-Anrufs
So habe ich den folgenden Code:
Const WayLongerThanItShouldEverTakeMilliseconds As Integer = 60 * 30 * 1000
Public Async Function CallService(token as CancellationToken) As Task(Of ReturnType)
Dim client As IWcfService = _service
Dim returnTask As Task(Of ReturnType) = client.FunctionAsync()
Dim cancellationTask as Task = Task.Delay(WayLongerThanItShouldEverTakeMilliseconds, token).
ContinueWith(Function(t) Task.FromCanceled(token), TaskContinuationOptions.OnlyOnCanceled)
Await Task.WhenAny(returnTask, cancellationTask)
token.ThrowIfCancellationRequested()
Return Await returnTask
End Function
Es scheint zu funktionieren. Ich mag die Server-Effekte nicht, obwohl der Client hier wichtiger ist. Gibt es einen Rennfall, den ich vermisse? So etwas habe ich noch nicht gesehen.
Danke für die Korrektur. Ich dachte, dass ohne die ContinueWith-Fortsetzung das 'WhenAny' nicht ausgelöst wird, in der Annahme, dass es nur ausgelöst wurde, wenn eine Aufgabe in den Status Completed abgeschlossen wurde. – Shlomo
Code in Antwort integriert. Danke @usr. – Shlomo