我有一个项目,我试图在构造函数中填充一些数据:
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;
}
}
不幸的是,我收到一个错误:
修饰符async
对该商品无效
当然,如果我包装一个标准方法并从构造函数中调用它:
public async void Foo()
{
Data = await GetDataTask();
}
效果很好。同样,如果我使用旧的由内而外的方式
GetData().ContinueWith(t => Data = t.Result);
这也有效。我只是想知道为什么我们不能打电话await
直接从构造函数内。可能有很多(甚至是明显的)边缘情况和反对它的理由,我只是想不出任何。我也四处寻找解释,但似乎找不到任何解释。
由于不可能创建异步构造函数,因此我使用静态异步方法,该方法返回由私有构造函数创建的类实例。这并不优雅,但效果还不错。
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;
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)