在C#中使用await内部属性

jbk*_*kkd 14 .net c# async-await c#-5.0

可能重复:
如何从getter或setter调用异步方法?

我正在尝试实现一个在其中使用Sqlite等待的属性:

public int ID {
        get
        {
            if (_id != null)
            {
                return _id;
            }
            if (string.IsNullOrEmpty(ImageName))
            {
                return -1;
            }
            var query = CurrentConnection.Table<Image>().Where(i => i.ImageName == ImageName);
            var result = await query.ToListAsync();
            ...other code
Run Code Online (Sandbox Code Playgroud)

但是,由于属性未设置为等待(尝试过,不起作用),我不能在属性中使用await.

除了使用方法而不是属性之外,还有什么方法可以解决这个问题?

Jon*_*eet 11

不 - 没有async属性这样的东西.即使你可以声明一个异步属性,它也必须被声明为具有返回值Task<int>而不是int...否则当你点击await表达式时你想要返回什么?

强烈建议使用一种GetIdAsync方法,假设您确实需要异步行为.

  • 还要注意,如果它是`Task <int>类型的属性,它会使setter*真的很奇怪. (3认同)

Ste*_*ary 10

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

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

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

  1. 一种返回值的异步方法.在这种情况下,将属性更改为async方法.
  2. 可以在数据绑定中使用但必须异步计算/检索的值.在这种情况下,要么使用async工厂方法来包含对象,要么使用async InitAsync()方法.数据绑定值将default(T)一直到计算/检索该值.
  3. 一个创建起来很昂贵的值,但应该缓存以供将来使用.在这种情况下,请使用AsyncLazy 我的博客AsyncEx库.这将为您提供一个有await能力的财产.