如何解决'System.Threading.Tasks.TaskFactory.StartNew(System.Func)'有一些无效的参数

时间:2015-06-30 19:33:39

标签: asp.net-mvc multithreading c#-4.0

以下代码给出了以下错误 -

  

'System.Threading.Tasks.TaskFactory.StartNew(System.Func)'有一些   无效的参数

public Task<string[]> SayHelloAsync()
{
    Task<string> t1 = Task.Factory.StartNew<string>(GreetUser());
    Task<string> t2 = Task.Factory.StartNew<string>(GreetCustomer());
    Task.WhenAll(t1, t2);
}
private string GreetUser()
{
    return "Hello";
}

private string GreetCustomer()
{
    return "Namaste";
}

这有什么不对。 我正在使用ASP.Net MVC

2 个答案:

答案 0 :(得分:2)

  

'System.Threading.Tasks.TaskFactory.StartNew(System.Func)'   有一些无效的论点

您应该按照以下方式陈述新任务 -

Task.Factory.StartNew<string>(() => GreetUser());
总的来说,该方法应该像 -

public Task<string[]> SayHelloAsync()
{
    Task<string> t1 = Task.Factory.StartNew<string>(() => GreetUser());
    Task<string> t2 = Task.Factory.StartNew<string>(() => GreetCustomer());
    return Task.WhenAll(t1, t2);
}
private string GreetUser()
{
    return "Hi";
}

private string GreetCustomer()
{
    return "Hi";
}

答案 1 :(得分:1)

要扩展ramiramilu的答案,如果你的DoWork方法是无参数的,你可以传递它并且它也可以工作(注意你只需要传递方法,而不是调用方法)。

    void StartWork()
    {
        var task = System.Threading.Tasks.Task.Factory.StartNew<string>(DoWork);  //note, you're using "DoWork", not "DoWork()"!!!
    }

    string DoWork()
    {
        //do stuff
        return "stuff";
    }

仅当您的DoWork方法需要您要从调用方法传递的输入参数时,才需要使用lambda表达式。在这种情况下,您需要使用lambda表达式。

    void StartWork()
    {
        var task = System.Threading.Tasks.Task.Factory.StartNew<string>(() => DoWork("my param"));
    }

    string DoWork(string myParams)
    {
        //do stuff
        return myParams;
    }

否则,您只需传递方法的名称并将其称为一天。