Chcę uruchomić operację, która powinna przekroczyć limit czasu po n milisekundach. Zaimplementowałem to na dwa sposoby, jeden poprzez anulowanie operacji samemu po odczekaniu n milisekund i jeden przez przekazanie zestawu CancellationToken, aby wygasł po n milisekundach.timeout cancellationtoken vs task.delay() i timeout
Obawiam się, że ponieważ mój system jest obciążony dużym obciążeniem, sygnał anulujący może wygasnąć przed rozpoczęciem operacji. Wygląda na to, że jeśli sam wykonam timeout za pomocą Task.Delay(), wówczas wywołanie opóźnienia() nie będzie działać, dopóki nie zacznie się moja operacja.
Oto jak ja to robię:
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));
porównaniu do:
CancellationTokenSource source = new CancellationTokenSource(TimeSpan.FromMilliseconds(n));
await SomeOperationAsync(source.Token);
To jest jedno duże obciążenie, aby wygasić źródło anulowania przed rozpoczęciem operacji. – Paparazzi