【发布时间】:2011-09-29 22:37:32
【问题描述】:
在 C# 中从 getter 或 setter 调用异步方法的最优雅的方式是什么?
这里有一些伪代码来帮助解释我自己。
async Task<IEnumerable> MyAsyncMethod()
{
return await DoSomethingAsync();
}
public IEnumerable MyList
{
get
{
//call MyAsyncMethod() here
}
}
【问题讨论】:
-
我的问题是为什么。属性应该模仿类似于字段的东西,因为它通常应该执行很少(或至少非常快速)的工作。如果你有一个长期运行的属性,最好把它写成一个方法,这样调用者就知道它是一个更复杂的工作体。
-
@James:完全正确——我怀疑这就是 CTP 明确不支持的原因。话虽如此,您始终可以创建
Task<T>类型的属性,它将立即返回,具有正常的属性语义,并且仍然允许根据需要异步处理事物。 -
@James 我的需求源于使用 Mvvm 和 Silverlight。我希望能够绑定到一个属性,其中数据的加载是延迟完成的。我使用的 ComboBox 扩展类需要在 InitializeComponent() 阶段进行绑定,但实际数据加载要晚得多。在尝试用尽可能少的代码完成任务时,getter 和 async 感觉就像是完美的组合。
-
我知道您的示例返回一个 Enumerable,但如果您的异步方法只返回一个 Task,您可以将其更改为返回 void 并从 setter 调用它。