【问题标题】:Task.StartNew beginner issueTask.StartNew 初学者问题
【发布时间】:2012-09-17 05:13:45
【问题描述】:
Task.Factory.StartNew((param,param2) => { Console.WriteLine("Test"); },
                                        TaskCreationOptions.None);

错误 1 ​​委托“System.Action”不接受 2 个参数

我收到上述错误。无法理解发生了什么问题。

已编辑:为什么它接受单个参数

  Task.Factory.StartNew((param1) =>
            {
                for (int j = 0; j < 10; j++)
                {
                    Console.WriteLine(string.Format("Task : {0}, outputing {1}- {2}",
                       param1, j.ToString(), param1));
                }
            }, string.Format("Tast Count " + ic++.ToString()));

【问题讨论】:

    标签: .net c#-4.0 task-parallel-library


    【解决方案1】:

    Task.Factory.StartNew 方法有 several overloads。您在问题中提到的两个是:

    Task.Factory.StartNew(Action, TaskCreationOptions)
    Task.Factory.StartNew(Action<Object>, Object)
    

    这些方法做了相当不同的事情。不过,需要注意的是ActionAction&lt;object&gt; 之间的区别。 Lambda 本质上是匿名方法,因此为了直观了解它们是什么,让我们将它们转换为方法签名。

    Action                 -> void AnonymousMethod()
    Action<object>         -> void AnonymousMethod(object f)
    Action<object, object> -> void AnonymousMethod(object f, object s)
    

    在您的第一个示例中,它无法编译,它等同于最后一个示例。接受多个参数的Task.Factory.StartNew 没有重载。

    【讨论】:

      【解决方案2】:

      StartNew 接受Action 委托,其定义为:

      public delegate void Action()
      

      即没有返回值,也没有参数的方法。您正在尝试将两个参数传递给操作:paramparam2

      您的代码应如下所示:

      Task.Factory.StartNew(() => { Console.WriteLine("Test"); });
                          // ^^ Note: no "param" or "param2".
      

      另外,TaskCreationOptions 附加到自定义任务工厂,而不是默认任务工厂。

      【讨论】:

      • 我认为 TaskCreationOptions 也没有传递给 StartNew()。
      • @Sepster 确实 - 它们用于自定义任务工厂。我已经编辑了我的答案。谢谢! :)
      • 但这并不能解释为什么它使用单个参数。
      【解决方案3】:

      Task.Factory.StartNew 有 1 个参数,一个 System.Action

      还有一个System.Action根据MSDN Action Delegate

      封装一个没有参数且不返回a的方法 价值。

      从外观上看,您正在尝试传递两个参数?您没有将 TaskCreationOptions.None 传递给 StartNew()。如果你确实想传递选项(你不想传递,因为你使用的是 'none'),你会创建一个自定义任务工厂(将选项传递给它的构造函数)。

      【讨论】:

        猜你喜欢
        • 2020-01-04
        • 2020-11-23
        • 2015-03-16
        • 2012-04-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多