我们可以在构造函数中调用await吗?

问题描述 投票:0回答:1
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

也行不通

然而

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
new-operator vb.net-2010
1个回答
1
投票

这是真的?

是。

为什么?

Async Sub(或async void)方法被添加到C#和VB中,因此事件处理程序可以是异步的。你应该在所有其他情况下避免使用Async Sub。具体来说,Async Sub不是实现构造函数的有效方法。

构造函数不能是异步的,并且语言可能在可预见的将来保持这个原则。如果你需要异步构造一个实例,你应该使用一个工厂方法,即一个静态方法,它返回你的类型为Task(Of T)T。我的blog post on async constructors中描述了更多细节和替代方法。

© www.soinside.com 2019 - 2024. All rights reserved.