Task.StartNew初学者问题

时间:2012-09-17 05:13:46

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

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()));

3 个答案:

答案 0 :(得分:2)

StartNew需要Action委托,其定义为:

public delegate void Action()

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

您的代码应如下所示:

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

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

答案 1 :(得分:2)

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

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

这些方法做了很多不同的事情。但是,注意事项是ActionAction<object>之间的差异。 Lambdas本质上是匿名方法,所以为了了解它们是什么,让我们将它们转换为方法签名。

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

在你的第一个没有编译的例子中,它等同于最后一个。 Task.Factory.StartNew没有带有多个参数的重载。

答案 2 :(得分:1)

Task.Factory.StartNew需要1个参数,System.Action

根据MSDN Action Delegate

System.Action
  

封装没有参数但不返回的方法   值。

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