C# 是否可以在方法中的任务中使用取消令牌?
我刚刚开始处理任务,对于在任务中调用方法,我有一些不太了解的地方。我已经开始了这样一项新任务:C# 是否可以在方法中的任务中使用取消令牌?,c#,.net,task-parallel-library,task,C#,.net,Task Parallel Library,Task,我刚刚开始处理任务,对于在任务中调用方法,我有一些不太了解的地方。我已经开始了这样一项新任务: var ts = new CancellationTokenSource(); var token = ts.Token; Task.Run(() => Control(), token); void Control() { while(!token.IsCancellationRequested) { token.ThrowIfCancella
var ts = new CancellationTokenSource();
var token = ts.Token;
Task.Run(() => Control(), token);
void Control()
{
while(!token.IsCancellationRequested)
{
token.ThrowIfCancellationRequested();
switch(ENUM)
{
case SOMETHING:
StartSomething();
break;
}
Task.Delay(50, token).wait();
}
}
现在我不明白一旦令牌被取消,StartSomething()
的行为。如果StartSomething()
也包含while循环,我也可以使用它吗
!token.IsCancellationRequested
及
同样,如果在
StartSomething()
循环中抛出取消异常,它会立即取消任务吗?是的,您可以轻松地将相同的令牌传递到StartSomething
,它的异常将冒泡到控制
并取消任务。如果不这样做,则即使取消了CancellationToken,它仍将继续运行,直到它将控制权返回到观察该令牌的
control`:
void StartSomething(CancellationToken token)
{
while (true)
{
token.ThrowIfCancellationRequested(); // Will cancel the task.
// ...
}
}
请记住,
token.ThrowIfCancellationRequested()
将引发异常,任务将在期间取消!token.IsCancellationRequested
将简单地完成任务,而不会将其标记为已取消 理想情况下,您希望将令牌
传递到任何可能需要一些时间的东西上,可能是启动something()
,并定期检查令牌是否取消。谢谢!如果任务在StartSomething()方法中被取消,该方法会立即取消任务,还是首先返回Control()循环,然后执行?@user2818626它会抛出一个异常,该异常会在控件中冒泡出现。只要你没有抓住它,任务就会被取消。@user2818626是的,是的。异步几乎总是比同步阻塞好。@user2818626等待就是这样做的。它只是异步地等待。该行之后的代码将不会继续运行。谢谢!现在一切都有了意义:)
void StartSomething(CancellationToken token)
{
while (true)
{
token.ThrowIfCancellationRequested(); // Will cancel the task.
// ...
}
}