Можем ли мы вызвать ожидание в конструкторе? - PullRequest
0 голосов
/ 23 апреля 2019
Shared Sub New()
    'Await setAllAccountsAsync()
    SetAllAccounts()
End Sub

Этот работает

Тем не менее,

Shared Sub New()
    Await setAllAccountsAsync()
    'SetAllAccounts()
End Sub

не

Shared async Sub New()
    Await setAllAccountsAsync()
    'SetAllAccounts()
End Sub

тоже не работает

1012 * Тем не менее *

Private Shared Async Sub SetAllAccounts()
    Await setAllAccountsAsync()
End Sub

отлично работает.

Таким образом, мы можем вернуть void в асинхронном режиме, но мы не можем сделать это в конструкторе. Зачем? Это правда?

Примечание:

Я не хочу, чтобы это был конструктор. Заметил, что это общий новый, а не новый. Я просто хочу, чтобы какой-то код запускался один раз. Например, в моем случае инициализатор будет просматривать веб-страницы, находить все торговые пары и сохранять торговые пары в закрытой переменной. Я хочу, чтобы это было сделано до использования класса.

Содержимое setAllAccountsAsync следующее

Private Async Function initializeAsync() As Task
    _marketid = Await CookieAwareWebClient.downloadString1Async("https://www.coinexchange.io/api/v1/getmarkets")
End Function

1 Ответ

1 голос
/ 23 апреля 2019

Это правда?

Да.

Почему?

Async Sub (или async void)методы были добавлены в C # и VB, чтобы обработчики событий могли быть асинхронными.Вам следует избегать Async Sub во всех других ситуациях.В частности, Async Sub не является допустимым способом реализации конструктора.

Конструкторы не могут быть асинхронными, и язык, скорее всего, сохранит этот принцип в обозримом будущем.Если вам нужно асинхронно создать экземпляр, вы должны использовать фабричный метод, то есть статический метод, который возвращает Task(Of T) для любого T вашего типа.Более подробная информация и альтернативные подходы описаны в моем блоге об асинхронных конструкторах .

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