方法的上市返回类型为Task<string>
。您正在尝试返回string
。它们不一样,也没有从字符串到Task<string>
的隐式转换,因此是错误。
您可能会将此与async
方法混淆,其中返回值被编译器自动封装到Task
中。目前该方法不是异步方法。你几乎肯定意味着要这样做:
private async Task<string> methodAsync()
{
await Task.Delay(10000);
return "Hello";
}
有两个关键的变化。首先,该方法被标记为async
,这意味着返回类型被封装在一个Task
中,从而使该方法编译。接下来,我们不想阻止等待。作为一般规则,当使用await
型号时,请尽量避免阻止等待。 Task.Delay
是在指定的毫秒数之后完成的任务。通过await
-这项任务,我们正在有效地执行一个非阻塞等待的时间(实际上该方法的其余部分是该任务的延续)。
如果你喜欢这样做,而无需使用await
的4.0的方式,你可以这样做:
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();
});
}
我怎么能明确地包裹在''Task' string'?OR没有任何方法可以在被调用的方法(methodAsync在这种情况下)中不使用'async'和'await'来返回Task或Task? –
dotNETbeginner
@dotNETbeginner否 –
@Aniket不,你错了,有很多方法显式包装一个字符串的任务。我将编辑一个解决方案。 – Servy