我有几个任务需要执行,每个任务的执行时间不同。其中一些任务执行数据库访问,另一些任务只做一些计算。我的代码结构如下:
var Canceller = new CancellationTokenSource();
List<Task<int>> tasks = new List<Task<int>>();
tasks.Add(new Task<int>(() => { Thread.Sleep(3000); Console.WriteLine("{0}: {1}", DateTime.Now, 3); return 3; }, Canceller.Token));
tasks.Add(new Task<int>(() => { Thread.Sleep(1000); Console.WriteLine("{0}: {1}", DateTime.Now, 1); return 1; }, Canceller.Token));
tasks.Add(new Task<int>(() => { Thread.Sleep(2000); Console.WriteLine("{0}: {1}", DateTime.Now, 2); return 2; }, Canceller.Token));
tasks.Add(new Task<int>(() => { Thread.Sleep(8000); Console.WriteLine("{0}: {1}", DateTime.Now, 8); return 8; }, Canceller.Token));
tasks.Add(new Task<int>(() => { Thread.Sleep(6000); Console.WriteLine("{0}: {1}", DateTime.Now, 6); return 6; }, Canceller.Token));
tasks.ForEach(x => x.Start());
bool Result = Task.WaitAll(tasks.Select(x => x).ToArray(), 3000);
Console.WriteLine(Result);
Canceller.Cancel();
tasks.ToList().ForEach(x => { x.Dispose(); }); // Exception here
tasks.Clear();
tasks = null;
Canceller.Dispose();
Canceller = null;
我有5秒钟的时间来启动所有这些任务。每5秒钟我会调用上面的代码。在下一次调用之前,我必须确保上一个执行周期中没有剩余任务。比如说,如果执行后经过了3秒钟,我希望取消未完成的任务的执行。
当我运行代码
Task.WaitAll
并将参数设置为3000时,前3个任务按预期完成。然后我得到Result
为false
的结果,因为还有2个任务未完成。然后我必须取消这两个任务。如果我试图释放它们,我会收到异常提示“已完成的任务只能被释放”。我该怎么做才能实现这个目标呢?在调用
CancellationTokenSource
的Cancel
方法后,这两个任务仍然在执行。问题出在哪里?
Sleep(8000)
)分成若干部分(Sleep(100) * 80
),并在开始每一部分之前检查IsCancelationRequest
。 - Sinatr