2015-01-14 7 views
1

Вызов awaitMethod() не печатает второй призыв console.printline в GetFilmCount() ни делает последний оператор печати в awaitMethod() вызывается. Единственный выход - Console.printLine() при первом вызове GetFilmCount().метод Асинхронный не вызывая

Я делаю что-то неправильно здесь. Не могу понять, почему так оно себя ведет?

public async void awaitMethod() 
{ 
    int count1 = await GetFilmCount(1); 
    int count2 = await GetFilmCount(2); 

    Console.WriteLine("Number of films {0}, {1} ", count1,count2); 
} 

public async Task<int> GetFilmCount(int count) 
{ 
    Console.WriteLine("Count {0} ", count); 

    using (MySqlConnection connection = new MySqlConnection(connectionString)) 
    { 
     connection.Open(); 

     MySqlCommand cmd = new MySqlCommand("select sleep(5) ; select count(*) from sakila.film", connection); 

     return await cmd.ExecuteScalarAsync().ContinueWith(t => { 
      return Convert.ToInt32(t.Result); 
     }); 
    } 
} 
+0

Как вы звоните 'awaitMethod'? –

ответ

4

Вы не должны использовать async void, если это не обработчик событий UI (который, кажется, не быть).

Возможно, что вы не дожидаетесь завершения awaitMethod (вы не можете, потому что это метод void), и поэтому консольное приложение заканчивается до того, как остальная часть вашего кода имеет шанс выполнить.

Используйте async Task вместо и await (или вызвать Wait() если это в Main) возвращаемый Task:

public async Task awaitMethod() 
{ 
    int count1 = await GetFilmCount(1); 
    int count2 = await GetFilmCount(2); 

    Console.WriteLine("Number of films {0}, {1} ", count1,count2); 
} 
+1

Спасибо, изменил его, чтобы вызвать p.awaitMethod(). Wait(); :) – jtkSource

+1

@jtkSource просто помните, что вы должны делать это только тогда, когда находитесь в функции 'Main', делайте это с помощью приложения пользовательского интерфейса или вы закроете свою программу. (Я знаю, что это было упомянуто в ответе, но эта ошибка сделана достаточно часто, я хотел сказать это снова) –

+0

@ScottChamberlain - согласен! Есть ли настоящая потребность в асинхронном шаблоне? не может быть достигнуто с существующей библиотекой – jtkSource

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