是否可以使对象构造异步?

时间:2016-09-16 14:15:42

标签: c# async-await

我有一个async函数,可以从我的webservice

中检索信息
private static async Task<DataClass> retrievData(){
...
}

我需要在构造函数中使用此信息,但我无法阻止我的应用程序的其余部分

所以我想做点像

public class MyClass {
     private DataClass theData;
     public async Myclass(){
          var dataTemp = await Server.retrievData();
          if(dataTemp.ValidatorNumber == Server.Validator.FULL)
              theData = dataTemp
          ...
     }

但不允许这样做。有解决办法吗?

1 个答案:

答案 0 :(得分:7)

您无法构建构造函数async。但是,您可以创建async工厂方法:

public class MyClass {
    private DataClass theData;
    private Myclass(DataClass theData) {
        this.theData = theData;
    }
    public static async MyClass Create() {
        var dataTemp = await Server.retrievData();
        if(dataTemp.ValidatorNumber == Server.Validator.FULL)
              return new DataClass(dataTemp);
        ... // Deal with the error here
    }
}

现在,调用者可以异步创建MyClass实例,如下所示:

var c = await MyClass.Create().ConfigureAwait(false);