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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (23)

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

这里有一些伪代码来帮助解释。

async Task<IEnumerable> MyAsyncMethod()
{
    return await DoSomethingAsync();
}

public IEnumerable MyList
{
    get
    {
         //call MyAsyncMethod() here
    }
}
提问于
用户回答回答于

您不能异步调用它,因为不支持异步属性,只有异步方法。因此,有两个选项,它们都利用了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;
    }
}
用户回答回答于

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

属性应该返回当前值; 他们不应该开展后台操作。

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

  1. 一个返回值的异步方法。在这种情况下,请将属性更改为async方法。
  2. 可以在数据绑定中使用的值,但必须异步计算/检索。在这种情况下,可以使用async包含对象的工厂方法或使用async InitAsync()方法。数据绑定值将default(T)一直到值被计算/检索。
  3. 一个创建成本很高的值,但应该缓存以供将来使用。在这种情况下,请使用AsyncLazy。这会给你一个await可靠的属性。

扫码关注云+社区