예제 #1
0
        /// <summary>
        /// Execute task with timeout
        /// </summary>
        /// <typeparam name="T">Task result type</typeparam>
        /// <param name="task">Task</param>
        /// <param name="timeout">Timeout value</param>
        /// <returns></returns>
        public static Task <T> WithTimeout <T>(this Task <T> task, TimeSpan timeout)
        {
            var tcs = new TaskCompletionSource <T>();

            task.ContinueWith(t => tcs.Propagate(task),
                              TaskContinuationOptions.ExecuteSynchronously);

            Task.Delay(timeout).ContinueWith(t => tcs.TrySetCanceled(),
                                             TaskContinuationOptions.ExecuteSynchronously);

            return(tcs.Task);
        }