Exemplo n.º 1
0
        public static ActionExecutionResult WithTimeout(this Action action, int timeoutSeconds)
        {
            var result = new ActionExecutionResult {
                Action = action
            };
            TimeSpan timeout = TimeSpan.FromSeconds(timeoutSeconds);

            using (var src = new CancellationTokenSource())
            {
                var startParams = new ParameterizedThreadStart(ExecuteAction);
                var t           = new Thread(startParams);
                t.Start(result);
                var threadTask = Task.Run(() => t.Join());
                Task.WaitAny(threadTask, Task.Delay(timeout, src.Token));
                if (threadTask.IsCompleted)
                {
                    src.Cancel();
                    if (result.Exception != null)
                    {
                        result.TimedOut = result.Exception is TimeoutException;
                        result.Success  = false;
                    }
                    else
                    {
                        result.Success = true;
                    }
                }
                else
                {
                    t.Abort();
                    result.Exception = new ActionTimeoutException(result, timeout);
                }
            }
            return(result);
        }
Exemplo n.º 2
0
 public ActionTimeoutException(ActionExecutionResult result, TimeSpan timeout)
 {
     this.result  = result;
     this.timeout = timeout;
 }