жду, немедленно переходит к следующему утверждению - PullRequest
4 голосов
/ 31 мая 2011

Я играю с новыми битами 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;
    }
}

немедленно возвращается и печатает System.Threading.Tasks.Task 1 [System.Int32] `вместо ожидания в течение 10 секунд и возврата 7 (как я и ожидал). Должно быть что-то очевидное, что я скучаю.

Ответы [ 3 ]

10 голосов
/ 31 мая 2011

Весь смысл основанного на await кода состоит в том, что он действительно «выполняет следующий материал, когда это будет завершено» (обратный вызов), и не »блокирует текущий нить, пока это не закончится ".

Таким образом, с Ten2SevenAsync вы получаете задачу , но эта задача еще не завершена. Запись задачи в консоль не означает, что она ожидает ее завершения. Если вы хотите заблокировать выполнение задачи:

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

или более явно:

static void Main() {
    Program p = new Program();
    var s = p.Ten2SevenAsync();
    s.Wait();
    Console.WriteLine(s.Result);
}
2 голосов
/ 31 мая 2011

Полагаю, вам просто нужно изменить 4-ю строку вашего примера на:

var s = await p.Ten2SevenAsync();
1 голос
/ 31 мая 2011

s является ссылкой на асинхронную задачу.Я сам еще не играл с этим, поэтому я не уверен в синтаксисе, но будут члены s, которые позволят вам проверить, завершилось ли задание или нет, и затем получат результат.

...