有人可以帮助我了解取消任务的工作原理吗?我从docs.microsoft.com阅读了一些简单的示例,但是我的实现无法按预期工作。
下面是我尝试使用的内容:
private Task _Task { get; set; }
private CancellationTokenSource _TaskCancellationTokenSource { get; set; }
private void StartTask()
{
_TaskCancellationTokenSource = new CancellationTokenSource();
_Task = Task.Run(async () =>
{
while (true)
{
if(_TaskCancellationTokenSource.IsCancellationRequested)
{
Console.WriteLine("Canceling");
_TaskCancellationTokenSource.Token.ThrowIfCancellationRequested();
}
Console.WriteLine("Running");
await Task.Delay(10000, _TaskCancellationTokenSource.Token);
}
}, _TaskCancellationTokenSource.Token);
}
private void StopTask()
{
Console.WriteLine("Stoping task");
_TaskCancellationTokenSource.Cancel();
Console.WriteLine("Task stoped");
}
我每隔10秒调用一次StartTask()。控制台会按原样写入“正在运行”。但是在调用StopTask()之后,仅出现“正在停止任务”和“任务已停止”。永远不会将“取消”写入控制台。但是VS调试器在已取消的“任务”属性中显示,并且“运行”不再出现。
答案 0 :(得分:0)
我认为调用_TaskCancellationTokenSource.Cancel();在您的子线程中引发某种异常。 (可能是TaskCanceledException)
尝试将任务代码包装在try / catch附件中,并在catch子句中显示消息。
答案 1 :(得分:0)
谢谢大家。我的问题下面的Mike评论是正确的。
Task.Delay正在使用相同的取消令牌创建任务。
我从以下位置更改了
await Task.Delay(3000, _TaskCancellationTokenSource.Token);
收件人:
await Task.Delay(3000);
它完全可以按照我的要求来工作。