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

3 回答 3

2

该方法有几个重载Task.Factory.StartNew。您在问题中提到的两个是:

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

这些方法做了相当不同的事情。Action但是,需要注意的是和之间的区别Action<object>。Lambda 本质上是匿名方法,因此为了直观地了解它们是什么,让我们将它们转换为方法签名。

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

在您的第一个示例中,它无法编译,它等效于最后一个示例。没有重载,因为Task.Factory.StartNew它需要多个参数。

于 2012-09-17T05:40:58.217 回答
2

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

public delegate void Action()

也就是没有返回值,也没有参数的方法。您正在尝试将两个参数传递给一个动作:paramparam2.

您的代码应如下所示:

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

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

于 2012-09-17T05:17:36.343 回答
1

Task.Factory.StartNew接受 1 个参数 a System.Action

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

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

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

于 2012-09-17T05:18:01.400 回答