Что такое асинхронные методы. NET и как вы их называете? - PullRequest
0 голосов
/ 21 апреля 2020

Я заметил, что некоторые классы. NET содержат асинхронные методы, а некоторые классы, такие как System. Net .Http.HttpClient, предоставляют только асинхронные методы.

1 Ответ

0 голосов
/ 21 апреля 2020

. NET ввел асинхронные методы несколько лет go. Общая идея заключается в том, что вы можете вызывать асинхронный метод и, пока он обрабатывает, вы можете выполнять другие действия, ожидая завершения асинхронного метода.

Что делает метод асинхронным? По соглашению асинхронный метод содержит слово Asyn c в названии метода. Асинхронный метод должен использовать ключевое слово Await как минимум один раз и возвращать объект Task.

Когда вы вызываете асинхронный метод, перед вызовом метода можно добавить слово Await. При обнаружении этой строки кода асинхронный метод начнет выполняться, и вместо его ожидания ваш код будет продолжаться до тех пор, пока не будет использован результат асинхронного метода.

Например:

Async Function GetFullNameAsync() As Task(Of String)

        Dim FirstNameTask = GetFirstNameAsync()
        Dim MiddleNameTask = GetMiddleNameAsync()
        Dim LastNameTask = GetLastNameAsync()

        Dim FirstName = Await FirstNameTask
        Dim MiddleName = Await MiddleNameTask
        Dim LastName = Await LastNameTask

        Return FirstName & " " & MiddleName & " " & LastName

End Function

Скажем, каждому из этих методов «Name» требуется 2 секунды, чтобы вернуть ответ:

Async Function GetFirstNameAsync() As Task(Of String)

        Await Task.Delay(2000)

        Return "Steve"

End Function

Если бы вы вызывали каждый из этих методов синхронно, то для этого потребовалось бы всего 6 секунд, чтобы получить полное имя. Однако, вызывая методы с использованием ключевого слова Await , вы получите результат через 2 секунды, поскольку все 3 имени извлекаются одновременно!

По сути, поэтому рекомендуется НЕ вызывать асинхронный метод без ключевого слова Await . Вы упускаете преимущества асинхронного метода с самого начала. Однако существует строгое требование: чтобы использовать ключевое слово Await , необходимо вызывать его внутри асинхронного метода.

Итак, если вы вызываете асинхронный метод из «обычного» синхронного метода, вы не можете использовать Await . Что делать? Просто вызовите метод, но используйте свойство .Result. Вызов свойства .Result (или .Wait, если метод ничего не возвращает) автоматически подождет или «заблокирует код», пока асинхронный метод не вернёт желаемое значение.

Например:

Function GetFullName() As String

        Dim FirstName = GetFirstNameAsync().Result()
        Dim MiddleName = GetMiddleNameAsync().Result()
        Dim LastName = GetLastNameAsync().Result()

        Return FirstName & " " & MiddleName & " " & LastName

End Function

Вы должны быть здесь немного осторожнее. Из-за особенностей асинхронных методов это может привести к тупику в вашем приложении. Я думаю, что все будет в порядке, если вы вызываете это в консольном приложении, но в приложении с событием l oop, например ASP. NET Web Forms или Windows Forms, вы можете захотеть выполните что-то вроде следующего:

Function GetFullNameAlt() As String

        Dim FirstNameTask = Task.Run(Function() GetFirstNameAsync())
        Dim MiddleNameTask = Task.Run(Function() GetMiddleNameAsync())
        Dim LastNameTask = Task.Run(Function() GetLastNameAsync())

        Dim FirstName = FirstNameTask.Result()
        Dim MiddleName = MiddleNameTask.Result()
        Dim LastName = LastNameTask.Result()

        Return FirstName & " " & MiddleName & " " & LastName

End Function

Это может быть вашим лучшим вариантом для вызова асинхронных методов в синхронной среде. Это позволяет использовать асинхронность метода без использования ключевого слова Await и без использования асинхронного метода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...