Kniga-Online.club
» » » » Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю

Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю

Читать бесплатно Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю. Жанр: Базы данных год 2004. Так же читаем полные версии (весь текст) онлайн без регистрации и SMS на сайте kniga-online.club или прочесть краткое содержание, предисловие (аннотацию), описание и ознакомиться с отзывами (комментариями) о произведении.
Перейти на страницу:

Асинхронные методы, возвращающие void и поддерживающие await

Если асинхронный метод должен поддерживать await, тогда используйте необобщенный класс Task и опустите любые операторы return, например:

static async Task MethodReturningTaskOfVoidAsync()

{

  await Task.Run(() => { /*  Выполнить какую-то работу... */

                         Thread.Sleep(4_000);

                       });

  Console.WriteLine("Void method completed");

                  // Метод завершен

}

Затем в коде, вызывающем этот метод, примените ключевое слово await:

MethodReturningVoidAsync();

Console.WriteLine("Void method complete");

Асинхронные методы, возвращающие void и работающие в стиле "запустил и забыл"

 Если метод должен быть асинхронным, но не обязан поддерживать await и применяться в сценариях "запустил и забыл", тогда добавьте ключевое слово async и сделайте возвращаемым типом void, а не Task. Методы такого рода обычно используются для задач вроде ведения журнала, когда нежелательно, чтобы запись в журнал приводила к задержке выполнения остального кода.

static async void MethodReturningVoidAsync()

{

  await Task.Run(() => { /* Выполнить какую-то работу... */

                         Thread.Sleep(4_000);

                       });

  Console.WriteLine("Fire and forget void method completed");

                  // Метод завершен

}

Затем в коде, вызывающем этот метод, ключевое слово await не используется:

MethodReturningVoidAsync();

Console.WriteLine("Void method complete");

Асинхронные методы с множеством контекстов await

Внутри реализации асинхронного метода разрешено иметь множество контекстов await. Следующий код является вполне допустимым:

static async Task MultipleAwaits()

{

    await Task.Run(() => { Thread.Sleep(2_000); });

    Console.WriteLine("Done with first task!");

                    // Первая задача завершена!

    await Task.Run(() => { Thread.Sleep(2_000); });

(window.adrunTag = window.adrunTag || []).push({v: 1, el: 'adrun-4-390', c: 4, b: 390})

    Console.WriteLine("Done with second task!");

                    // Вторая задача завершена!

    await Task.Run(() => { Thread.Sleep(2_000); });

(window.adrunTag = window.adrunTag || []).push({v: 1, el: 'adrun-4-390', c: 4, b: 390})

    Console.WriteLine("Done with third task!");

                    // Третья задача завершена!

}

Здесь каждая задача всего лишь приостанавливает текущий поток на некоторый период времени; тем не менее, посредством таких задач может быть представлена любая единица работы (обращение к веб-службе, чтение базы данных или что-нибудь еще). Еще один вариант предусматривает ожидание не каждой отдельной задачи, а всех их вместе. Это более вероятный сценарий, когда имеются три работы (скажем, проверка поступления сообщений электронной почты, обновление сервера, загрузка файлов), которые должны делаться в пакете, но могут выполняться параллельно. Ниже приведен модифицированный код, в котором используется метод Task.WhenAll():

static async Task MultipleAwaits()

{

  var task1 = Task.Run(() =>

  {

    Thread.Sleep(2_000);

    Console.WriteLine("Done with first task!");

  });

  var task2=Task.Run(() =>

  {

    Thread.Sleep(1_000);

    Console.WriteLine("Done with second task!");

  });

    var task3 = Task.Run(() =>

  {

    Thread.Sleep(1_000);

    Console.WriteLine("Done with third task!");

  });

  await Task.WhenAll(task1, task2, task3);

}

Запустив программу, вы увидите, что три задачи запускаются в порядке от наименьшего значения, указанного при вызове метода Sleep():

Fun With Async ===>

Done with work!

Void method completed

Done with second task!

Done with third task!

Done with first task!

Completed

Существует также метод WhenAnу(), возвращающий задачу, которая завершилась. Для демонстрации работы WhenAny() измените последнюю строку метода MultipleAwaits() следующим образом:

Перейти на страницу:

Троелсен Эндрю читать все книги автора по порядку

Троелсен Эндрю - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки kniga-online.club.


Язык программирования C#9 и платформа .NET5 отзывы

Отзывы читателей о книге Язык программирования C#9 и платформа .NET5, автор: Троелсен Эндрю. Читайте комментарии и мнения людей о произведении.


Уважаемые читатели и просто посетители нашей библиотеки! Просим Вас придерживаться определенных правил при комментировании литературных произведений.

  • 1. Просьба отказаться от дискриминационных высказываний. Мы защищаем право наших читателей свободно выражать свою точку зрения. Вместе с тем мы не терпим агрессии. На сайте запрещено оставлять комментарий, который содержит унизительные высказывания или призывы к насилию по отношению к отдельным лицам или группам людей на основании их расы, этнического происхождения, вероисповедания, недееспособности, пола, возраста, статуса ветерана, касты или сексуальной ориентации.
  • 2. Просьба отказаться от оскорблений, угроз и запугиваний.
  • 3. Просьба отказаться от нецензурной лексики.
  • 4. Просьба вести себя максимально корректно как по отношению к авторам, так и по отношению к другим читателям и их комментариям.

Надеемся на Ваше понимание и благоразумие. С уважением, администратор kniga-online.


Прокомментировать
Подтвердите что вы не робот:*
Подтвердите что вы не робот:*