我正在尝试在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个参数。
如何从任务中获得两件事(传递参数并检索值)的任何帮助都会很棒!
答案 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关于TaskFactory。StartNew的文档,其中声明:
<强>状态强>
类型:System.Object
包含要由函数委托使用的数据的对象。
答案 2 :(得分:0)