3 回答
TA贡献1865条经验 获得超7个赞
没有技术原因async在C#中不允许使用属性。这是一个有目的的设计决策,因为“异步属性”是矛盾的。
属性应返回当前值; 他们不应该开始背景操作。
通常,当有人想要“异步属性”时,他们真正想要的是以下之一:
一种返回值的异步方法。在这种情况下,将属性更改为async方法。
可以在数据绑定中使用但必须异步计算/检索的值。在这种情况下,要么使用async工厂方法来包含对象,要么使用async InitAsync()方法。数据绑定值将default(T)一直到计算/检索该值。
一个创建起来很昂贵的值,但应该缓存以供将来使用。在这种情况下,请使用AsyncLazy 我的博客或AsyncEx库。这将为您提供一个有await能力的财产。
更新:我在我最近的一篇“异步OOP”博客文章中介绍了异步属性。
TA贡献1873条经验 获得超9个赞
您不能异步调用它,因为没有异步属性支持,只有异步方法。因此,有两个选项,都利用了CTP中的异步方法实际上只是一个返回的方法Task<T>或Task:
// Make the property return a Task<T>
public Task<IEnumerable> MyList
{
get
{
// Just call the method
return MyAsyncMethod();
}
}
要么:
// Make the property blocking
public IEnumerable MyList
{
get
{
// Block via .Result
return MyAsyncMethod().Result;
}
}
- 3 回答
- 0 关注
- 796 浏览
添加回答
举报