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

How to solve 'System.Threading.Tasks.TaskFactory.StartNew(System.Func)' has some invalid arguments

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

'System.Threading.Tasks.TaskFactory.StartNew(System.Func)' has some invalid arguments

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

'System.Threading.Tasks.TaskFactory.StartNew(System.Func)' has some invalid arguments

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

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";
}

为了扩展 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;
    }

否则,您只需传递方法名称即可。