列出的方法返回类型是Task<string>
. 您正在尝试返回一个string
. 它们不一样,也没有从 string 到 的隐式转换Task<string>
,因此出现错误。
您可能会将其与编译器async
自动将返回值包装在 a 中的方法混淆。Task
目前该方法不是异步方法。你几乎肯定是要这样做的:
private async Task<string> methodAsync()
{
await Task.Delay(10000);
return "Hello";
}
有两个关键变化。首先,方法被标记为async
,这意味着返回类型被包裹在 a 中Task
,使得方法可以编译。接下来,我们不想进行阻塞等待。作为一般规则,在使用await
模型时,尽可能避免阻塞等待。 Task.Delay
是一个将在指定的毫秒数后完成的任务。通过await
-ing 该任务,我们有效地执行了该时间的非阻塞等待(实际上该方法的其余部分是该任务的延续)。
如果您更喜欢 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();
});
}