могу ли я распоряжаться CancellationTokenSource
до отмены Task
?Если нет, то почему?
Код 1 (из Отмена задачи . Я внес некоторые незначительные изменения для упрощения), кажется, рекомендует подождать Task
, прежде чем утилизировать CancellationTokenSource
.Если это так, метод Dispose
класса, содержащего CancellationTokenSource
, будет более сложным, чем я надеюсь.
На моем компьютере Code 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();
}
}
РЕДАКТИРОВАТЬ: Мой случай
На самом деле мне интересно, нужно ли мне Wait
для отмены задачи в методе Dispose
.
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;
}
}