How to cancel a task that is waiting with a timeout without exceptions being thrown
You could call Task.WaitAny
with an array of just that task. Then you can act on the status of the task, however the method returns. Sample code:
using System;using System.Threading;using System.Threading.Tasks;class Test{ static void Main() { Task sleeper = Task.Factory.StartNew(() => Thread.Sleep(100000)); int index = Task.WaitAny(new[] { sleeper }, TimeSpan.FromSeconds(0.5)); Console.WriteLine(index); // Prints -1, timeout var cts = new CancellationTokenSource(); // Just a simple wait of getting a cancellable task Task cancellable = sleeper.ContinueWith(ignored => {}, cts.Token); // It doesn't matter that we cancel before the wait cts.Cancel(); index = Task.WaitAny(new[] { cancellable }, TimeSpan.FromSeconds(0.5)); Console.WriteLine(index); // 0 - task 0 has completed (ish :) Console.WriteLine(cancellable.Status); // Cancelled }}
Note that if the task is faulted, you should "observe" the exception in order to avoid it going bang when it's finalized :)
try to use OperationCanceledException
try{ mytask.start(); bool didTaskRunInTime = mytask.wait(5 mins, _cancelToken); if (didTaskRunInTime ) { int taskResult = myTask.Result; //log result to file } else { // Tell user task timed out , log a message etc }}catch (OperationCanceledException ex){ // log cancel from user to file et}