【发布时间】:2011-12-30 00:52:31
【问题描述】:
我有一个项目,我试图在构造函数中填充一些数据:
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。可能有很多(甚至是明显的)边缘案例和反对它的原因,我只是想不出。我也四处寻找解释,但似乎找不到任何解释。
【问题讨论】:
-
不,但在他的blog 中,Stephen Cleary 提供了一种工厂方法 方法以及其他可供考虑的方法。
-
this answer 中提出的模式效果很好,它是工厂模式的一个分支,但我将开始将其称为
async constructor pattern。
标签: c# constructor async-await