【问题标题】:How to start a task that takes a parameter and returns a value?如何启动接受参数并返回值的任务?
【发布时间】:2012-06-06 18:41:42
【问题描述】:

我正在尝试在 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 个参数。

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

【问题讨论】:

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


    【解决方案1】:

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

    Task&lt;T&gt; 上的泛型类型参数是Task 的返回类型。

    最好的选择是使用闭包:

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

    【讨论】:

      【解决方案2】:

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

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

      请参阅 TaskFactory.StartNew 上的 msdn 文档,其中指出:

      状态

      类型:System.Object

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

      【讨论】:

      • @svick 我同意,我只是想用 OP 的问题来回答我的问题。
      • 只是我还是将参数类型的规范包含在签名的泛型类型中更有意义,至少作为额外的重载?
      • 闭包与对象状态相比有开销,因为它分配了额外的委托。查看 Joe Hoag 在 Microsoft PfxTeam 博客 blogs.msdn.com/b/pfxteam/archive/2011/11/10/10235834.aspx 上的帖子
      【解决方案3】:

      你可以使用Task&lt;t&gt;(看here) 当然,T 是返回值。至于参数 - 你可以只在匿名委托中使用你的变量,所以如果你在任务之外定义了int o,你可以在任务匿名委托范围内使用它。 你可以看到一个样本here

      【讨论】:

      • 所以你是说避免为 lambda 指定参数.. 对吗?换句话说,不是 (o) => ..do something with o,而是声明一个临时的来在任务本身之外保存 o,然后只需使用 () => ..do something with o
      • task&lt;T&gt; 类接受一个 Func 委托,该委托要么不接收参数并返回 T,要么接受和对象并返回 T。您可能可以使用对象重载,如 msdn 中所述,但有没有理由。您在.net 中编写的任何匿名/ lambda 委托也可以访问其定义的范围的变量,正如您在我提供的链接/Nicholas Butlers 回答中所见。你不需要在 lambda 中指定参数,是的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多