如何启动一个带参数并返回值的任务?

时间:2012-06-06 18:41:43

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

我正在尝试在C#中启动一个任务,它接受一个参数并返回一个值,但我似乎无法使语法正确。

这里和我一样接近:这是一个预计返回int的任务。我是我的lambda,我也用一个参数显示它,o:

Task<int> task1 = Task.Factory.StartNew<int>((o) => { return 2 ; }, 3);
Console.WriteLine(task1.Result);  // prints 2

上面的行有效(它返回一个2的硬编码值,但你可以看到它对参数o没有任何作用,使它无用。如果我用参数o做某事,就像这样:

Task<int> task1 = Task.Factory.StartNew<int>((o) => { return (2 * o) ; }, 3);

我收到一条语法消息,委托'System.Func'不带1个参数。

如何从任务中获得两件事(传递参数并检索值)的任何帮助都会很棒!

3 个答案:

答案 0 :(得分:3)

Task的输入(状态)参数只能是object类型,因此它实际上不是类型安全的。

Task<T>上的泛型类型参数是Task的返回类型。

最好的选择是使用闭包:

int i = 3;
Task<int> task1 = Task.Factory.StartNew( () => 2 * i );

答案 1 :(得分:3)

o是对象状态,在您的情况下,是您传入的值,或3.您可以将其强制转换为int

Task<int> task = Task.Factory.StartNew<int>(o => {
    return 2 * (int)o;
}, 3);

Console.WriteLine(task.Result); // prints 6

请参阅msdn关于TaskFactoryStartNew的文档,其中声明:

  

<强>状态

     

类型:System.Object

     

包含要由函数委托使用的数据的对象。

答案 2 :(得分:0)

你可以使用Theres Task<t>(看here) 当然,T是返回值。从参数开始 - 您可以在匿名委托中使用ur变量,因此如果您在任务之外定义了int o,则可以在任务匿名委托范围内使用它。 您可以看到示例here