Я уже знаю, что async-await
хранит контекст потока, а также обрабатывает пересылку исключений и т. д. (что очень помогает).
Но рассмотрим следующий пример:
/*1*/ public async Task<int> ExampleMethodAsync()
/*2*/ {
/*3*/ var httpClient = new HttpClient();
/*4*/
/*5*/ //start async task...
/*6*/ Task<string> contentsTask = httpClient.GetStringAsync("http://msdn.microsoft.com");
/*7*/
/*8*/ //wait and return...
/*9*/ string contents = await contentsTask;
/*10*/
/*11*/ //get the length...
/*12*/ int exampleInt = contents.Length;
/*13*/
/*14*/ //return the length...
/*15*/ return exampleInt;
/*16*/ }
Если метод async
(httpClient.GetStringAsync
) является операцией ввода-вывода (как в моем примере выше), то я получаю следующие вещи:
- Абонент Тема не заблокирована
Рабочий поток освобождается из-за операции IO ( порты завершения ввода-вывода...)(GetStringAsync используетTaskCompletionSource
и не открывает новый поток)- Сохраненный контекст потока
- Исключение возвращается
Но что, если вместо httpClient.GetStringAsync
(операция ввода-вывода) у меня есть Task CalcFirstMillionsDigitsOf_PI_Async
(операция с тяжелыми вычислениями в отдельном потоке)
Кажется, единственное, что я здесь получаю, это:
- Сохраненный контекст потока
- Исключение возвращается
- Абонент Тема не заблокирована
Но у меня все еще есть другой поток (параллельный поток), который выполняет операцию. и процессор переключается между основным потоком и операцией.
Верна ли моя диагностика?
await
, а не ключевым словомasync
. - person xanatos   schedule 26.08.2013