我有以这种方式创建的任务:
public static Task<T> RunAsync<T>(Func<T> function, CancellationToken token) {
if (function == null) throw new ArgumentNullException("");
var tcs = new TaskCompletionSource<T>();
ThreadPool.QueueUserWorkItem(_ => {
try {
T result = function();
tcs.SetResult(result);
}
catch (Exception exc) { tcs.TrySetException(exc); }
}, token);
return tcs.Task;
}
我在此方法之后添加任务列表。 在System.Timer事件中,我检查任务的执行以启用/禁用这样的按钮:
if (this.Tasks.Count > 0) {
Task.WaitAll(this.Tasks.ToArray(), this.cancToken);
this.BeginInvoke(new Action(() => EnableControls()));
this.Task.Clear();
}
好吧,如果任务正确完成,一切正常,但如果任务通过cancellationToken生成异常并且状态在“故障”中发生变化,那么WaitAll仍会被阻止。为什么?我无法理解。
我已在我的任务功能中提出取消,如下所示:
if (cancToken.IsCancellationRequested)
this.cancToken.ThrowIfCancellationRequested();
感谢。