Функции async/await в C# 5.0

Язык C# Важно
  1. 6 года назад

    Alexandr_Erohin

    Aug 11 Администратор
    Добавлено 6 года назад Alexandr_Erohin

    В C# 5.0 было добавлено 2 новых ключевых слова - оператор await и модификатор async. Методы, использующие модификатор async, автоматически преобразуются в асинхронные, правда нужно учитывать, что метод должен возвращать Task<T> или void. Оператор await нужен для объединения последовательности асинхронных операций в одну.

    Давайте рассмотрим следующий пример, в котором показан синхронный запрос к веб-странице через HttpWebRequest (используется простое WPF-приложение с двумя текстовыми полями и кнопкой):

    private void button_Click(object sender, RoutedEventArgs e)
    {
                var request = System.Net.WebRequest.Create(textBox1.Text);
                var content = new System.IO.MemoryStream(); 
                
                using (var response = request.GetResponse()) 
                {
                    using (var responseStream = response.GetResponseStream()) 
                    {
                        responseStream.CopyTo(content); 
                    } 
                } 
                textBox2.Text = content.Length.ToString(); 
    }

    -image-

    В приведенном примере после того, как вы щелкните по кнопке, вы не сможете сделать никаких изменений в форме, пока запрос не вернет результат. Давайте теперь посмотрим видоизмененную версию предыдущего кода, добавив асинхронную обработку запроса:

    private async void button_Click(object sender, RoutedEventArgs e)
    {
                var request = System.Net.WebRequest.Create(textBox1.Text);
                var content = new System.IO.MemoryStream();
    
                System.Threading.Tasks.Task<System.Net.WebResponse> responseTask = 
                    request.GetResponseAsync(); 
    
                // Асинхронная операция
                using (var response = await responseTask)
                {
                    using (var responseStream = response.GetResponseStream())
                    {
                        System.Threading.Tasks.Task copyTask = responseStream.CopyToAsync(content); 
    
                        // Оператор await приостанавливает выполнение метода, пока задача не будет завершена
                        await copyTask; 
                    }
                }
                textBox2.Text = content.Length.ToString();
    }

    Теперь запрос будет выполняться в фоновом потоке, и после клика по кнопке форма приложения будет сразу доступна.

или зарегистрируйтесь чтобы ответить