Search code examples
c#.netmultithreadingtask-parallel-librarytask

Does Task.Wait(int) stop the task if the timeout elapses without the task finishing?


I have a task and I expect it to take under a second to run but if it takes longer than a few seconds I want to cancel the task.

For example:

Task t = new Task(() =>
        {
            while (true)
            {
                Thread.Sleep(500);
            }
        });
t.Start();
t.Wait(3000);

Notice that after 3000 milliseconds the wait expires. Was the task canceled when the timeout expired or is the task still running?


Solution

  • If you want to cancel a Task, you should pass in a CancellationToken when you create the task. That will allow you to cancel the Task from the outside. You could tie cancellation to a timer if you want.

    To create a Task with a Cancellation token see this example:

    var tokenSource = new CancellationTokenSource();
    var token = tokenSource.Token;
    
    var t = Task.Factory.StartNew(() => {
        // do some work
        if (token.IsCancellationRequested) {
            // Clean up as needed here ....
        }
        token.ThrowIfCancellationRequested();
    }, token);
    

    To cancel the Task call Cancel() on the tokenSource.