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

时间:2019-04-23 16:44:56

标签: new-operator vb.net-2010

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

也不起作用

但是

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

工作正常。

因此我们可以在异步中返回void,但不能在构造函数中这样做。为什么?这是真的吗?

注意:

我不希望它实际上是一个构造函数。注意它是共享的,而不是新的。我只希望一些代码运行一次。例如,在我的情况下,初始化器将在网上冲浪并找到所有交易对并将交易对存储在私有变量中。我希望在使用该类之前完成该操作。

setAllAccountsAsync的内容如下

for component in nx.connected_components(graph):
    # Each component is the set of nodes
    print(component)
    # Filter all edges in graph: we keep only that are in the component
    print(list(
        filter(
            lambda x: x[0] in component and x[1] in component,
            graph.edges
        )
    ))

1 个答案:

答案 0 :(得分:1)

  

这是真的吗?

是的

  

为什么?

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

构造函数不能异步,并且该语言很可能在可预见的将来保留该原理。如果您需要异步构造实例,则应使用工厂方法,即,针对您的类型Task(Of T)返回T的静态方法。我的blog post on async constructors中介绍了更多详细信息和替代方法。