【发布时间】:2018-11-19 03:26:18
【问题描述】:
我可以在Task 被取消之前处置CancellationTokenSource 吗?如果不是,为什么?
代码 1(来自 Task Cancellation。为了简化,我做了一些小改动)似乎建议在处理 CancellationTokenSource 之前等待 Task。如果是这样,包含CancellationTokenSource 的类的Dispose 方法将比我希望的要复杂。
在我的电脑上,代码 2 似乎也可以正常工作。我可以改用这种模式吗?
代码 1:取消完成后处置
[STAThread]
private static void Main() {
var tokenSource2 = new CancellationTokenSource();
var task = DoAsync(tokenSource2.Token);
tokenSource2.Cancel();
tokenSource2 = null;
try {
task.Wait();
}
catch (AggregateException e) {
foreach (var v in e.InnerExceptions)
Console.WriteLine(e.Message + " " + v.Message);
}
finally {
tokenSource2.Dispose();
}
Console.ReadKey();
}
private static async Task DoAsync(CancellationToken token) {
while (true) {
await Task.Delay(10000).ConfigureAwait(true);
token.ThrowIfCancellationRequested();
}
}
代码 2:取消完成前处置
[STAThread]
private static void Main() {
var tokenSource2 = new CancellationTokenSource();
var task = DoAsync(tokenSource2.Token);
tokenSource2.Cancel();
tokenSource2.Dispose();
try {
task.Wait();
}
catch (AggregateException e) {
foreach (var v in e.InnerExceptions)
Console.WriteLine(e.Message + " " + v.Message);
}
finally {
//// tokenSource2.Dispose();
}
Console.ReadKey();
}
private static async Task DoAsync(CancellationToken token) {
while (true) {
await Task.Delay(10000).ConfigureAwait(true);
token.ThrowIfCancellationRequested();
}
}
编辑:我的情况
其实我想知道是否必须在Dispose 方法中使用Wait 来取消任务。
public class Class1 : IDisposable {
//// tokenSource for calculationTask
private CancellationTokenSource tokenSource;
//// background calculation task
private Task calculationTask;
public void Dispose() {
tokenSource?.Cancel();
//// calculationTask.Wait(); Should I wait for task completion?
tokenSource?.Dispose();
tokenSource = null;
calculationTask = null;
}
}
【问题讨论】:
标签: c# parallel-processing task-parallel-library cancellation cancellationtokensource