我想知道使用CancellationTokenSource和退出标志结束循环任务之间是否有任何区别
CancellationTokenSource:
CancellationTokenSource cancellationTokenSource;
Task loopTask;
void StartLoop()
{
cancellationTokenSource = new CancellationTokenSource();
loopTask = Task.Factory.StartNew(Loop, TaskCreationOptions.LongRunning);
}
void Loop()
{
while (true)
{
if (cancellationTokenSource.IsCancellationRequested)
break;
Thread.Yield();
}
}
void StopLoop()
{
cancellationTokenSource.Cancel();
loopTask = null;
cancellationTokenSource = null;
}
退出标志:
volatile bool exitLoop;
Task loopTask;
void StartLoop()
{
exitLoop = false;
loopTask = Task.Factory.StartNew(Loop, TaskCreationOptions.LongRunning);
}
void Loop()
{
while (true)
{
if (exitLoop)
break;
Thread.Yield();
}
}
void StopLoop()
{
exitLoop = true;
loopTask = null;
}
对我而言,使用CancellationTokenSource并没有任何意义,顺便说一句,为什么取消令牌可以作为参数添加到任务工厂?
非常感谢您的回答。
最好的ragards teamol
答案 0 :(得分:11)
CancellationToken
允许令牌处理所有必要的同步,因此您不必考虑它。Task
错误被标记为已取消,则会将Task
的状态设置为已取消,而不是出现故障。如果您使用布尔值(并且不抛出),则该任务实际上会被标记为已成功完成,即使它实际已被取消。