【问题标题】:Task.Run Ambiguous Parameter OverloadsTask.Run 不明确的参数重载
【发布时间】:2016-04-01 05:50:15
【问题描述】:

我在 C# 中使用 Task 类,并希望将返回值的预定义方法传递给 Task.Run 方法,而不是使用 lambda。

这是一个带有代码的控制台应用程序:

static int ThreadMethod()
{
    return 42;
}

static void Main(string[] args)
{
    Task<int> t = Task.Run(function:ThreadMethod);
    WriteLine(t.Result);
}

但是,它返回此错误:

以下方法或属性之间的调用不明确:'Task.Run(Func)' 和 'Task.Run(Func)'

我尝试这样做来修复它并得到了我的预期结果:

Task<int> t = Task.Run((Func<int>)ThreadMethod);

但是,我不确定我做得对还是有更好的解决方案?

【问题讨论】:

  • Func 和 Action 只是代表。他们只有一个名字;)。改用 lambda。顺便说一句,他们是匿名代表。 ()=&gt;ThreadMethod()
  • 通过一些技巧,如果您出于任何原因不想使用 lambda。你可以这样做。Task.Run(function: ThreadMethod)。但是您应该将方法签名更改为此。 static async Task&lt;int&gt; ThreadMethod()。这是没有意义的,但它可以编译。
  • 哇,async 部分让它更加混乱。对不起,我仍然是 C# 中多任务和异步编程的菜鸟
  • 无论如何,感谢您回答我的问题。同时,我会按照您和 Cubicle Jockey 的建议去做,同时寻找更多信息。
  • 此问题已在 C# 7.3 中修复,请参阅 this answer

标签: c# task-parallel-library


【解决方案1】:

修复您的 .Run 参数,如本例所示。可以复制粘贴到LinqPad进行测试。

public static void Main(string[] args)
{
    Task<int> t = Task.Run(() => ThreadMethod());
    WriteLine(t.Result);
}

public static int ThreadMethod()
{
    return 42;
}

如果您想将其视为变量以通过以下检查:

public static void Main(string[] args)
{

    //Func<int> is saying I want a function with no parameters
    //but returns an int. '() =>' this represents a function with 
    //no parameters. It then points to your defined method ThreadMethod
    //Which fits the notions of no parameters and returning an int.

    Func<int> threadMethod = () => ThreadMethod();

    Task<int> t = Task.Run(threadMethod);
    Console.WriteLine(t.Result);
}

public static int ThreadMethod()
{
    return 42;
}

这里是 Func(T) 上的Documentation,在左侧菜单中,您可以选择 Func() 对象的不同变体。

【讨论】:

  • 您能否进一步详细说明为什么这比转换为 (Func) 更好?我只是想更好地理解它。或者,也许一个好的参考真的会有所帮助。
  • 用要研究的文档的链接更新了我的答案。
  • 谢谢。我会查看您提供的所有信息并尝试更多地掌握它。
猜你喜欢
  • 2012-12-19
  • 2016-03-07
  • 1970-01-01
  • 2011-06-08
  • 2013-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多