无法将 'System.Threading.Tasks.Task<System.Collections.Generic.List> 隐式转换为 'System.Collections.Generic.List<>

Cannot implicitly convert 'System.Threading.Tasks.Task<System.Collections.Generic.List> TO 'System.Collections.Generic.List<>

我将现有的一些方法设为异步,现在在调用这些方法的属性中我看到了错误:

Cannot implicitly convert 'System.Threading.Tasks.Task<System.Collections.Generic.List<MyProj.BLL.Property>> TO 'System.Collections.Generic.List<MyProj.BLL.Property>>

public List<Property> UserProperties
{
    get
    {
        if (userProperties == null)
        {
           userProperties = GetUserProperties(UserId);
        }
    }
}

private async Task<List<Property>> GetUserProperties(int userId)
{
    var result = await UserDAL.GetUserProperties(userid);
    return result;
}

'GetuserProperties' 是一种异步方法,它 return 是一个(可等待的)任务。如果你需要那个Task中的计算结果,有两种可能:

  1. 使用 userProperties = GetUserProperties(UserId).Result;.

这是毫无意义的,因为 Result 会阻塞您的线程,直到被调用的任务 return 返回结果。所以实际上你是同步调用 运行 的。此外,确实存在死锁的可能性,因为异步方法通常会尝试 return 其结果在阻塞等待结果的原始线程中。

  1. 使用 userProperties = await GetUserProperties(UserId).;。但是,这在 属性 setter 中是不允许的(不能是异步的)。参见 Await an async function from setter property

因此,如果您想异步获取 UserProperties,您应该为此放弃 属性,创建 'GetUserProperties' 方法 public 并直接调用它,而不是使用 属性 getter.

如果你这样做,我认为最好将 UserProperties 也设置为异步方法并完全放弃 属性。