/// <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)); }