列出的方法的返回类型为Task<string>。您正在尝试返回string。它们不相同,也没有从string到的隐式转换Task<string>,因此是错误的。
您可能会将其与一种async方法混淆,该方法的返回值Task由编译器自动包装在中。当前,该方法不是异步方法。您几乎肯定会这样做:
private async Task<string> methodAsync()
{
await Task.Delay(10000);
return "Hello";
}
有两个主要变化。首先,将方法标记为async,这意味着将返回类型包装在中Task,使方法可以编译。接下来,我们不想执行阻塞等待。通常,使用await模型时应始终避免阻塞等待。 Task.Delay是将在指定的毫秒数后完成的任务。通过await执行该任务,我们可以有效地执行那个时间的非阻塞等待(实际上,方法的其余部分是该任务的延续)。
如果您更喜欢4.0的方式而不使用await,则可以执行以下操作:
private Task<string> methodAsync()
{
return Task.Delay(10000)
.ContinueWith(t => "Hello");
}
第一个版本将编译为大约类似的形式,但是它将在其中包含一些额外的样板代码,以支持错误处理和其他功能。 await我们在这里没有利用的。
如果您Thread.Sleep(10000)真的只是打算作为某种长时间运行的方法的占位符,而不是仅仅等待一段时间,那么您将需要确保工作在另一个线程中完成,而不是在当前上下文中完成。最简单的方法是Task.Run:
private Task<string> methodAsync()
{
return Task.Run(()=>
{
SomeLongRunningMethod();
return "Hello";
});
}
或更可能的是:
private Task<string> methodAsync()
{
return Task.Run(()=>
{
return SomeLongRunningMethodThatReturnsAString();
});
}
string在Task?还是没有任何方法可以返回Task或Task<T>不使用async和await在被调用的方法中(在这种情况下为methodAsync)?