Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否可以在方法中的任务中使用取消令牌?_C#_.net_Task Parallel Library_Task - Fatal编程技术网

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.
        // ...
    }
}