c# - 构造函数可以异步吗?

标签 c# constructor async-await

我有一个项目,我试图在构造函数中填充一些数据:

public class ViewModel
{
    public ObservableCollection<TData> Data { get; set; }

    async public ViewModel()
    {
        Data = await GetDataTask();
    }

    public Task<ObservableCollection<TData>> GetDataTask()
    {
        Task<ObservableCollection<TData>> task;

        //Create a task which represents getting the data
        return task;
    }
}

不幸的是,我遇到了一个错误:

The modifier async is not valid for this item

当然,如果我包装一个标准方法并从构造函数中调用它:

public async void Foo()
{
    Data = await GetDataTask();
}

它工作正常。同样,如果我使用旧的由内而外的方式

GetData().ContinueWith(t => Data = t.Result);

这也行。我只是想知道为什么我们不能直接从构造函数中调用 await。可能有很多(甚至是明显的)边缘案例和反对它的理由,我只是想不出任何。我也在四处寻找解释,但似乎找不到任何解释。

最佳答案

由于无法创建异步构造函数,因此我使用静态异步方法返回由私有(private)构造函数创建的类实例。这不是很优雅,但可以正常工作。

public class ViewModel       
{       
    public ObservableCollection<TData> Data { get; set; }       

    //static async method that behave like a constructor       
    async public static Task<ViewModel> BuildViewModelAsync()  
    {       
        ObservableCollection<TData> tmpData = await GetDataTask();  
        return new ViewModel(tmpData);
    }       

    // private constructor called by the async method
    private ViewModel(ObservableCollection<TData> Data)
    {
        this.Data = Data;   
    }
}  

关于c# - 构造函数可以异步吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46849157/

相关文章:

c# - View 中的控件如何从 View 模型中获取特定数据?

c# - 需要帮助将 Delphi 时间转换为 .Net 时间

c# - LINQ to Entities 不支持“TimeOfDay” - 在 Linq 2 SQL 中查找总秒数

java - 强制子类具有特定的工厂方法或构造函数

c++ - 默认构造函数中未识别的标识符

c# - PCL 中的异步/等待 WCF 客户端

async-await - 在特定线程中运行异步函数

c# - 字符串声明和设置字符串为空有什么区别?

javascript - ImmutableJS 无法使用新的自定义对象实例

asynchronous - Dart-从流订阅 block 返回数据