Search code examples
c#multithreadingasync-awaittimeout

Is there a way to trigger 2 tasks, await for one to complete (without cancelling the other task) and then set a time before returning result


I am implementing a new feature in already existing application and would like to know how best I can achieve the following:

  1. Create two tasks.
  2. Start them in parallel.
  3. Await and wait for one of them to complete.
  4. Once one of them completes, spun a timer for t seconds before returning the response. This is done because one of the task might run for a longer time than another.

I have the solution of #1 to #3 but #4.

List<Task> tasks = new List<Task>(length);
tasks.Add(CreateTask(get_data_source));
await Task.WhenAny(tasks);

I don't want to provide any timeout in #3. But I would like to wait till the completion of a task and then trigger a timer for t seconds. After t seconds, return the result (if both completed, then both else just the completed task).


Solution

  • After first task complete, you can await for any of remaining tasks or delay task to complete .

    This will give you possibility to await 5 seconds for other tasks to complete, if not, then return result.

    var tasks = new List<Task>
    {
        CreateTask(get_data_source),
        CreateTask(get_data_source2)
    };
    
    var completedTask = await Task.WhenAny(tasks);
    
    await Task.WhenAny(Task.WhenAll(tasks), Task.Delay(5000));
    
    // Return result