为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
达令说 2019-08-31 15:06:07
从C#中的getter或setter调用异步方法最优雅的方法是什么?这里有一些伪代码可以帮助解释自己。async Task<IEnumerable> MyAsyncMethod(){    return await DoSomethingAsync();}public IEnumerable MyList{    get    {         //call MyAsyncMethod() here    }}
查看完整描述

3 回答

?
鸿蒙传说

TA贡献1865条经验 获得超7个赞

没有技术原因async在C#中不允许使用属性。这是一个有目的的设计决策,因为“异步属性”是矛盾的。


属性应返回当前值; 他们不应该开始背景操作。


通常,当有人想要“异步属性”时,他们真正想要的是以下之一:


一种返回值的异步方法。在这种情况下,将属性更改为async方法。

可以在数据绑定中使用但必须异步计算/检索的值。在这种情况下,要么使用async工厂方法来包含对象,要么使用async InitAsync()方法。数据绑定值将default(T)一直到计算/检索该值。

一个创建起来很昂贵的值,但应该缓存以供将来使用。在这种情况下,请使用AsyncLazy 我的博客或AsyncEx库。这将为您提供一个有await能力的财产。

更新:我在我最近的一篇“异步OOP”博客文章中介绍了异步属性。


查看完整回答
反对 回复 2019-08-31
?
眼眸繁星

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;

    }

}


查看完整回答
反对 回复 2019-08-31
  • 3 回答
  • 0 关注
  • 731 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信