await立即转到下一个声明

Fel*_*lix 4 c# asynchronous async-await async-ctp

我正在使用新的Async CTP位,我无法使用服务器端或命令行程序(并且所有示例都是WPF或Silverlight).例如,一些简单的代码,如:

class Program {
    static void Main() {
        Program p = new Program();
        var s = p.Ten2SevenAsync();
        Console.WriteLine(s);
    }

    private async Task<int> Ten2SevenAsync() {
        await TaskEx.Delay(10000);
        return 7;
    }
}
Run Code Online (Sandbox Code Playgroud)

立即返回并打印System.Threading.Tasks.Task1 [System.Int32]`而不是等待10秒并返回7(正如我所料).必须是我遗失的明显事物.

Mar*_*ell 10

基于await的代码的重点在于它确实"在完成后执行下一个东西"(一个回调),而不是 "阻止当前线程直到完成".

因此,从Ten2SevenAsync您返回任务,但该任务尚未完成.将任务写入控制台并不意味着它等待它完成.如果要阻止任务完成:

static void Main() {
    Program p = new Program();
    var s = p.Ten2SevenAsync();
    Console.WriteLine(s.Result);
}
Run Code Online (Sandbox Code Playgroud)

或更明确地:

static void Main() {
    Program p = new Program();
    var s = p.Ten2SevenAsync();
    s.Wait();
    Console.WriteLine(s.Result);
}
Run Code Online (Sandbox Code Playgroud)