Ich möchte eine Operation ausführen, die nach n Millisekunden Timeout sollte. Ich habe es auf zwei Arten implementiert, eine durch Abbrechen der Operation selbst nach dem Warten von n Millisekunden, und eine durch das Übergeben einer CancellationToken-Menge, um nach n Millisekunden abzulaufen.curlingtoken timeout vs task.delay() und timeout
Ich mache mir Sorgen, dass das cancelletoken ablaufen kann, bevor das System gestartet wird. Es scheint, dass, wenn ich das Timeout selbst mit Task.Delay() implementiere, der Aufruf von Delay() erst nach dem Start meiner Operation ausgeführt wird.
Hier ist, wie ich es so mache:
public static async Task<T> TimeoutAfter<T>(this Task<T> task, TimeSpan timeout)
{
Task completedTask = await Task.WhenAny(task, Task.Delay(timeout));
if (completedTask == task)
{
return await task;
}
throw new TimeoutException();
}
// Use it like this
await SomeOperationAsync().TimeoutAfter(TimeSpan.FromMilliseconds(n));
Im Vergleich zu:
CancellationTokenSource source = new CancellationTokenSource(TimeSpan.FromMilliseconds(n));
await SomeOperationAsync(source.Token);
Das ist eine schwere Last, um eine CancellationTokenSource abzulaufen, bevor die Operationen überhaupt beginnen. – Paparazzi