2013-09-13 5 views
-1

Я пытаюсь сделать простой пример, но я даже не получаю основы. Что случилось с этим кодом? Представьте, что Calculate() занимает несколько секунд.Async/await: Метод async

static void Main(string[] args) 
    { 
     int result = await Calculate(); 

     Console.WriteLine(result); 
     Console.ReadLine(); 
    } 

    static async Task<int> Calculate() 
    { 
     return 1; 
    } 
+0

использовать «классический» метод, чтобы получить результат из вашей задачи внутри main;) – olydis

+3

Вы можете найти мое ['async' intro] (http://blog.stephencleary.com/2012/02/async -and-await.html). –

ответ

4

Просто измените ваш главный на:

static void Main(string[] args) 
{ 
    int result = Calculate().Result; 

    Console.WriteLine(result); 
    Console.ReadLine(); 
} 

Как только вы используете await ключевое слово, окружающий метод должен быть помечен как async который - как и другие, отмеченные - невозможно для Main. С async методы вроде Calculate все еще возвращают старые добрые Task объекты, не стесняйтесь использовать «старый» способ борьбы с ними: используя Result, чтобы подождать результатов. Конечно, это операция блокировки - но нет причин не блокировать внутри Main, правильно? ;)

0

Вы можете сделать это:

static void Main() 
{ 
    WrapMain(); 
} 

static async void WrapMain() 
{ 
    int result = await Calculate(); 

    Console.WriteLine(result); 
    Console.ReadLine(); 
} 

static async Task<int> Calculate() 
{ 
    return await Task.Run(() => 
    { 
     return 1; 
    }); 
} 
+0

это не решает проблему Криса ... – olydis

+0

@olydis да, вы правы _mea culpa_. –

Смежные вопросы