2017-10-10 78 views
0
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading; 
using System.Threading.Tasks; 

namespace CancellationTokenExperiments 
{ 
    class CancellationTokenTest 
    { 
     static void Main(string[] args) 
     { 
      CancellationTokenSource tokenSource = new CancellationTokenSource(); 
      CancellationToken token = tokenSource.Token; 
      tokenSource.Cancel(); 
      Task.Run(() => Console.WriteLine("Hello from Task"), token); 

     } 
    } 
} 

我想了解C#中的cancellationTokens的概念。我知道上面的代码不会打印“来自任务的Hello”,因为在任务运行之前检查了令牌。了解C中的取消标记#

但是我有几个问题。

  1. Task.Run(() => Console.WriteLine("Hello from Task"), token);

是什么上面的语句是什么意思?在某种意义上,它与简单地叫Console.WriteLine("Hello from Task")有什么不同?只是通过传递令牌我们能够取消TaskTask.Run开头的空括号()是什么意思?

  1. 如何更改上述代码以便我可以及时停止特定实例的执行。
+1

“是否只是我们可以通过传递令牌来取消任务” - 否,任务中的代码必须在运行时检查取消令牌并在请求取消时退出。任务不会因为有取消请求而被神奇地停止。 – Enigmativity

+0

尽管它们具有相同的标题,但它与标记为重复的问题并不完全相同。被问及的问题和具体问题的内容是不同的。 –

回答

-1

首先,空括号是不带参数的lambda表达式的语法。

() => Console.WriteLine("Hello from Task") 

创建一个函数,然后传递给要运行的任务。

当您管理多个并发任务(通常是跨线程)时,取消值将显示在屏幕上。可靠的跨线程同步和取消需要一些工作和对多线程编程的理解,并使用取消令牌大大简化了它,并消除了许多常见的初学者陷阱。

当您在后台启动了一个较长时间的运行进程,然后希望在完成之前取消它时,将使用该令牌。

+0

是不是'()'表示没有参数,因为函数中没有参数?在示例中它确实将'string'作为参数。 – liv2hak

+0

@ liv2hak - '()'表示**中没有传入参数**。对'Console.WriteLine'的调用有一个参数,但它没有被**传递给**。 – Enigmativity

+0

@Samuel Neff - 我如何修改lambda以传递字符串? – liv2hak