Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.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# 为什么Task.Run()方法存在第二个`CancelationToken`类型的参数?_C#_.net_Scheduled Tasks - Fatal编程技术网

C# 为什么Task.Run()方法存在第二个`CancelationToken`类型的参数?

C# 为什么Task.Run()方法存在第二个`CancelationToken`类型的参数?,c#,.net,scheduled-tasks,C#,.net,Scheduled Tasks,我试图理解重载方法的必要性 如果Task.Run()方法的第一个参数中指定的函数没有传递第二个参数,为什么会存在第二个参数CancelationToken类型?在这里,我不得不在sum函数代码中对此使用闭包。另外,我在微软的代码示例中也看到了同样的情况(请查看上面的链接) 这是我的代码: using System; using System.Threading; using System.Threading.Tasks; namespace ThreadsLearning { clas

我试图理解重载方法的必要性

如果
Task.Run()
方法的第一个参数中指定的函数没有传递第二个参数,为什么会存在第二个参数
CancelationToken
类型?在这里,我不得不在
sum
函数代码中对此使用闭包。另外,我在微软的代码示例中也看到了同样的情况(请查看上面的链接)

这是我的代码:

using System;
using System.Threading;
using System.Threading.Tasks;

namespace ThreadsLearning {
    class Program {

        private static void Main(string[] args) {

            CancellationTokenSource tokenSrc = new CancellationTokenSource();

            Func<int, int> sum = n => {
                int result = 0;

                for (var i = 0; i <= n; i++) {
                    result += i;

                    tokenSrc.Token.ThrowIfCancellationRequested();

                    Console.WriteLine(result);
                    Thread.Sleep(200);
                }
                return result;
            };

            /* Why does exist a second parameter of CancelationToken type, if it
             * is even not passed into the function specified in the first parameter
             * of Task.Run() method?
             * I'm forced to use a closure for this in the 'sum' function code.
             */
            var task = Task.Run(() => sum(30), tokenSrc.Token);

            // I will get the seame result for CancellationToken.None:
            // var task = Task.Run(() => sum(30), CancellationToken.None);

            tokenSrc.CancelAfter(TimeSpan.FromSeconds(2));

            try {
                Console.WriteLine("Result: {0}", task.Result);
            }
            catch (AggregateException ex) {
                foreach (var item in ex.InnerExceptions) {
                    Console.WriteLine("Exception: {0}", item.Message);
                }
            }
            catch (Exception ex) {
                Console.WriteLine("Other exception (the other 'catch' block): {0}", ex.Message);
            }

            Console.WriteLine("Hit <Enter> for exit...");
            Console.ReadLine();
        }
    }
}
使用系统;
使用系统线程;
使用System.Threading.Tasks;
命名空间线程学习{
班级计划{
私有静态void Main(字符串[]args){
CancellationTokenSource tokenSrc=新的CancellationTokenSource();
Func sum=n=>{
int结果=0;
对于(var i=0;i而言,有两个原因:

  • 如果调用
    Task.Run
    时已请求取消,则传入
    CancellationToken
    可确保您的代码永远不会运行
  • 如果您的代码从传入的同一个
    CancellationToken
    引发
    OperationCanceledException
    ,则该任务将被标记为已取消而不是失败。其他代码可能会检查任务状态并相应更改行为
    • 它有两个原因:

      • 如果调用
        Task.Run
        时已请求取消,则传入
        CancellationToken
        可确保您的代码永远不会运行
      • 如果您的代码从传入的同一个
        CancellationToken
        引发
        OperationCanceledException
        ,则该任务将被标记为已取消而不是失败。其他代码可能会检查任务状态并相应更改行为

      您链接到的备注的第一句-“如果在任务开始执行之前请求取消,则任务不会执行。相反,它被设置为已取消状态并引发TaskCanceledException异常。”(我的重点)相关:您链接到的备注的第一句-“如果在任务开始执行之前请求取消,则该任务不会执行。相反,它被设置为已取消状态并引发TaskCanceledException异常。”(我的重点)相关:你当然是对的。但我不明白为什么回调函数签名中没有
      CancellationToken
      。这种情况迫使我对这个实例使用闭包。我认为这不好。@AndreyBushman对。有(同上)您可以使用它来传递任意数据,包括取消令牌的另一个副本。遗憾的是,没有相应的
      任务。运行
      重载。当然,您是对的。但我不明白为什么
      取消令牌
      在回调函数签名中不存在……这种情况迫使我对是实例。我认为这不好。@AndreyBushman是的。您可以使用(同上)来传递任意数据,包括取消令牌的另一个副本。遗憾的是,没有相应的
      任务。运行
      重载。