Nik*_*hil 5 .net c# task-parallel-library async-await
我可能已经陷入了一种相当不成熟的困惑.请参考下面的代码(控制台应用程序)
namespace Tasks101
{
class Program
{
static void Main(string[] args)
{
Program p = new Program();
var x = p.Blah();
}
private async Task Blah()
{
await Task.Delay(TimeSpan.FromSeconds(3)).ConfigureAwait(false);
}
private async void ReturnsVoid()
{
await Task.Delay(TimeSpan.FromSeconds(3)).ConfigureAwait(false);
}
private void Nothing()
{
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,在Blah()方法中,当执行时,我还没有任何显式的return语句
var x = p.Blah();
Run Code Online (Sandbox Code Playgroud)
的类型x是Task.我再次在ReturnsVoid方法中没有return语句,但也编译.
所以问题是
Task从Blah方法返回一个没有我在return那里的声明,为什么同样的事情没有从ReturnsVoid方法返回任何东西.Blah方法返回的内容?如果我一个接一个地等待两个声明怎么办?Ste*_*ary 14
该async关键字的转换方法和构造返回的Task实例.该方法没有返回任何内容,async void因为它返回void; 这种缺乏Task是你应该避免的一个原因async void.async void不是一种自然的异步方法签名; 它仅受支持,以便事件处理程序可能async.
如果你想返回一个值,那么你应该让方法返回a Task<T>,例如,Task<int> BlahAsync()然后你可以直接返回值,例如,方法中return 13;的awaits 数与它无关.当方法执行实际返回(例如,return 13)时,async关键字将其解释为完成Task<int>已构造的那个.
我async在我的博客上有一个介绍,你可能会觉得有帮助.
i3a*_*non 10
Task为您生成一个代表整个异步操作的代码.async void - 除了事件处理程序之外的所有情况都应该避免这种情况async Task - 这里你无法控制返回的任务,它将在整个操作结束时(或抛出异常时)完成,无论你有多少等待.async Task<T>- 这允许实际返回一个值,但行为与...相同async Task.