Asynchronously wait for Task to complete with timeout

后端 未结 16 2025
天命终不由人
天命终不由人 2020-11-21 17:49

I want to wait for a Task to complete with some special rules: If it hasn\'t completed after X milliseconds, I want to display a message to the user. And

16条回答
  •  后悔当初
    2020-11-21 18:24

    How about this:

    int timeout = 1000;
    var task = SomeOperationAsync();
    if (await Task.WhenAny(task, Task.Delay(timeout)) == task) {
        // task completed within timeout
    } else { 
        // timeout logic
    }
    

    And here's a great blog post "Crafting a Task.TimeoutAfter Method" (from MS Parallel Library team) with more info on this sort of thing.

    Addition: at the request of a comment on my answer, here is an expanded solution that includes cancellation handling. Note that passing cancellation to the task and the timer means that there are multiple ways cancellation can be experienced in your code, and you should be sure to test for and be confident you properly handle all of them. Don't leave to chance various combinations and hope your computer does the right thing at runtime.

    int timeout = 1000;
    var task = SomeOperationAsync(cancellationToken);
    if (await Task.WhenAny(task, Task.Delay(timeout, cancellationToken)) == task)
    {
        // Task completed within timeout.
        // Consider that the task may have faulted or been canceled.
        // We re-await the task so that any exceptions/cancellation is rethrown.
        await task;
    
    }
    else
    {
        // timeout/cancellation logic
    }
    

提交回复
热议问题