/// <summary>Initializes a new instance of the <see cref="T:System.Object" /> class.</summary>
 private AutomaticCancellationTaskResult(TaskStatus taskStatus, CancellationResons cancellationReson = CancellationResons.None, T result = default(T), Exception error = null)
 {
     TaskStatus        = taskStatus;
     CancellationReson = cancellationReson;
     Result            = result;
     Error             = error;
 }
        protected AutomaticCancellationTask(TimeSpan timeoutSpan)
        {
            cancellationResons = CancellationResons.None;
            cts        = new AutomaticCancellationTokenSource(timeoutSpan);
            tcs        = new TaskCompletionSource <T>();//<object>();
            workThread = new Thread(() =>
            {
                try
                {
                    OnTaskStart();
                    var result = OnTaskDoing();
                    if (!IsCancellationRequested)
                    {
                        tcs.SetResult(result);
                        OnTaskEnd();
                    }
                }
                catch (ThreadAbortException tae)
                {
                    Thread.ResetAbort();
                }
                catch (Exception e)
                {
                    tcs.SetException(e);
                }
            });
            workThread.IsBackground    = true;
            cts.CancellationRequested += Cts_CancellationRequested;
            tcs.Task.ContinueWith(p =>
            {
                T result    = default(T);
                Exception e = null;
                if (p.IsCanceled)
                {
                    result = default(T);
                }
                else if (p.IsFaulted)
                {
                    e = p.Exception;
                }
                else
                {
                    result = p.Result;
                }

                var taskresult =
                    AutomaticCancellationTaskResult <T> .BuildResult(p.Status, cancellationResons, result, e);
                try
                {
                    OnTaskStatuesChanged(taskresult);
                }
                catch (Exception c)
                {
                    OnTaskError(taskresult, c);
                }
            });
            workThread.Start();
        }
        private void Cts_CancellationRequested(object sender, AutomaticCancellationEventArgs e)
        {
            var temptcs    = tcs;
            var tempthread = workThread;

            if (temptcs.Task.Status != TaskStatus.Canceled &&
                temptcs.Task.Status != TaskStatus.Faulted &&
                temptcs.Task.Status != TaskStatus.RanToCompletion
                )
            {
                cancellationResons = e.CancellationReson;
                tempthread.Abort(cancellationResons);
                tempthread.Join();
                temptcs.SetCanceled();
            }
        }
 public void Cancel()
 {
     cancellationResons = CancellationResons.CallCancle;
     cts.Cancel();
 }
 public AutomaticCancellationTokenSource(TimeSpan delay)
 {
     cancellationResons = CancellationResons.TimeOut;
     cts = new CancellationTokenSource(delay);
     cts.Token.Register(OnCancellationRequested);
 }
 public AutomaticCancellationEventArgs(CancellationResons cancellationReson)
 {
     CancellationReson = cancellationReson;
 }
 public static AutomaticCancellationTaskResult <T> BuildResult(TaskStatus taskStatus, CancellationResons cancellationReson = CancellationResons.None, T result = default(T), Exception error = null)
 {
     return(new AutomaticCancellationTaskResult <T>(taskStatus, cancellationReson, result, error));
 }