C# 无法隐式转换';System.Threading.Tasks.Task<;系统.集合.通用.列表>;至';System.Collections.Generic.List<&燃气轮机;

C# 无法隐式转换';System.Threading.Tasks.Task<;系统.集合.通用.列表>;至';System.Collections.Generic.List<&燃气轮机;,c#,asynchronous,async-await,task,C#,Asynchronous,Async Await,Task,我对现有的一些方法进行了异步处理,现在在调用这些方法的属性中,我看到了错误: 无法隐式转换 'System.Threading.Tasks.Task 至“System.Collections.Generic.List> 公共列表用户属性 { 得到 { if(userProperties==null) { userProperties=GetUserProperties(UserId); } } } 专用异步任务GetUserProperties(int userId) { var result=

我对现有的一些方法进行了异步处理,现在在调用这些方法的属性中,我看到了错误:

无法隐式转换 'System.Threading.Tasks.Task 至“System.Collections.Generic.List>

公共列表用户属性
{
得到
{
if(userProperties==null)
{
userProperties=GetUserProperties(UserId);
}
}
}
专用异步任务GetUserProperties(int userId)
{
var result=await UserDAL.GetUserProperties(userid);
返回结果;
}

“GetuserProperties”是一种异步方法,返回一个(可等待的)任务。如果您需要该任务中的计算结果,有两种可能性:

  • 使用
    userProperties=GetUserProperties(UserId)
  • 这是毫无意义的,因为在被调用的任务返回其结果之前,Result会阻塞线程。因此,实际上您使呼叫同步运行。此外,还存在死锁的实际可能性,因为异步方法通常试图在被阻塞等待结果的原始线程中返回其结果

  • 使用
    userProperties=await-GetUserProperties(UserId)。但是,在属性设置器中不允许这样做(不能是异步的)。看
  • 因此,如果您想异步获取UserProperties,您应该放弃该属性,将“GetUserProperties”方法公开并直接调用它,而不是使用属性getter


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

    您不会等待
    异步
    方法的结果。在这种情况下,您可能必须同步执行此操作,例如:通过使用任务的
    .Result
    属性,请在将来正确格式化代码。嗨,Johan,在我的情况下,我无法直接调用GetUserProperties(UserId),因为我的是MVC视图,我只能从MVC视图访问属性。。还有其他选择吗?如果你想同步获取UserProperties//你是指异步获取,因为我想异步运行它吗?@Claudia:这是一个输入错误。我更正了。@Claudia您可以考虑一种机制,在视图刷新自身(访问存储的属性)之前,先异步获取UserProperties,然后将其存储在属性中。
    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;
    }