列出的方法的返回类型为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)?