【问题标题】:Understanding cancellation tokens in C#了解 C# 中的取消标记
【发布时间】:2017-10-10 22:07:55
【问题描述】:
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# 中的 cancelTokens 的概念。我知道上面的代码不会打印“Hello from Task”,因为在任务运行之前会检查令牌。

不过我有几个问题。

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

上面的语句是什么意思?从某种意义上说,它与简单地调用 Console.WriteLine("Hello from Task") 有何不同?只是我们可以通过传递令牌来取消Task吗?还有Task.Run开头的空括号()是什么意思?

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

【问题讨论】:

  • “只是我们能够通过传递令牌来取消任务” - 不,任务中的代码必须在运行时检查取消令牌,如果请求取消则退出。任务不会因为有取消请求而神奇地停止。
  • 这与标记为重复的问题实际上不是同一个问题,即使它们具有相同的标题。问题的内容和提出的具体问题不同。

标签: c# cancellationtokensource cancellation-token


【解决方案1】:

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

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

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

当您管理多个并发任务(通常跨线程)时,取消的价值就体现出来了。可靠的跨线程同步和取消需要一些工作和对多线程编程的理解,使用取消令牌可以大大简化它并消除许多常见的初学者陷阱。

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

【讨论】:

  • () 是否意味着没有参数,因为函数没有参数?在示例中它确实将string 作为参数。
  • @liv2hak - () 表示没有传入的参数。对Console.WriteLine 的调用有一个参数,但它没有传入
  • @Samuel Neff - 如何修改 lambda 以传入字符串?
猜你喜欢
  • 1970-01-01
  • 2018-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-08
  • 2013-04-23
  • 2021-04-14
  • 2019-02-21
相关资源
最近更新 更多