3

我正在尝试在 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);

我收到一条语法消息,说明 Delegate 'System.Func' 不接受 1 个参数。

关于如何从任务中实现这两件事(传递参数和检索值)的任何帮助都会很棒!

4

3 回答 3

3

a 的输入( state )参数Task只能是 type object,所以它实际上不是类型安全的。

泛型类型参数 onTask<T>Task.

最好的选择是使用闭包:

int i = 3;
Task<int> task1 = Task.Factory.StartNew( () => 2 * i );
于 2012-06-06T18:50:59.280 回答
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

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

于 2012-06-06T18:54:32.690 回答
0

Task<t>可以使用(看这里) T 是返回值,当然。至于参数 - 您可以只在匿名委托中使用 ur 变量,因此如果您int o在任务之外定义了变量,则可以在任务匿名委托范围内使用它。你可以在这里看到一个样本

于 2012-06-06T18:46:17.570 回答