如何从getter或setter调用异步方法?

从C#中的getter或setter调用异步方法最优雅的方法是什么?


这里有一些伪代码可以帮助解释自己。


async Task<IEnumerable> MyAsyncMethod()

{

    return await DoSomethingAsync();

}


public IEnumerable MyList

{

    get

    {

         //call MyAsyncMethod() here

    }

}


达令说
浏览 734回答 3
3回答

鸿蒙传说

没有技术原因async在C#中不允许使用属性。这是一个有目的的设计决策,因为“异步属性”是矛盾的。属性应返回当前值; 他们不应该开始背景操作。通常,当有人想要“异步属性”时,他们真正想要的是以下之一:一种返回值的异步方法。在这种情况下,将属性更改为async方法。可以在数据绑定中使用但必须异步计算/检索的值。在这种情况下,要么使用async工厂方法来包含对象,要么使用async InitAsync()方法。数据绑定值将default(T)一直到计算/检索该值。一个创建起来很昂贵的值,但应该缓存以供将来使用。在这种情况下,请使用AsyncLazy 我的博客或AsyncEx库。这将为您提供一个有await能力的财产。更新:我在我最近的一篇“异步OOP”博客文章中介绍了异步属性。

眼眸繁星

您不能异步调用它,因为没有异步属性支持,只有异步方法。因此,有两个选项,都利用了CTP中的异步方法实际上只是一个返回的方法Task<T>或Task:// Make the property return a Task<T>public Task<IEnumerable> MyList{&nbsp; &nbsp; get&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Just call the method&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return MyAsyncMethod();&nbsp; &nbsp; }}要么:// Make the property blockingpublic IEnumerable MyList{&nbsp; &nbsp; get&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Block via .Result&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return MyAsyncMethod().Result;&nbsp; &nbsp; }}
打开App,查看更多内容
随时随地看视频慕课网APP