Task.Run模糊参数重载

时间:2015-11-23 06:33:44

标签: c# task-parallel-library

我在C#中使用Task类,并希望传递一个预定义的方法,该方法返回一个值而不使用lambdas到Task.Run方法。

这是一个控制台应用程序,代码为:

static int ThreadMethod()
{
    return 42;
}

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

然而,它正在返回此错误:

  

以下方法或属性之间的调用不明确:&#39; Task.Run&lt; TResult&gt;(Func&lt; TResult&gt;)&#39;和&#39; Task.Run(Func&lt; Task&gt;)&#39;

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

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

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

1 个答案:

答案 0 :(得分: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()对象的不同变体。