无法将 '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中的计算结果,有两种可能:
- 使用
userProperties = GetUserProperties(UserId).Result;
.
这是毫无意义的,因为 Result 会阻塞您的线程,直到被调用的任务 return 返回结果。所以实际上你是同步调用 运行 的。此外,确实存在死锁的可能性,因为异步方法通常会尝试 return 其结果在阻塞等待结果的原始线程中。
- 使用
userProperties = await GetUserProperties(UserId).;
。但是,这在 属性 setter 中是不允许的(不能是异步的)。参见 Await an async function from setter property
因此,如果您想异步获取 UserProperties,您应该为此放弃 属性,创建 'GetUserProperties' 方法 public 并直接调用它,而不是使用 属性 getter.
如果你这样做,我认为最好将 UserProperties 也设置为异步方法并完全放弃 属性。
我将现有的一些方法设为异步,现在在调用这些方法的属性中我看到了错误:
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中的计算结果,有两种可能:
- 使用
userProperties = GetUserProperties(UserId).Result;
.
这是毫无意义的,因为 Result 会阻塞您的线程,直到被调用的任务 return 返回结果。所以实际上你是同步调用 运行 的。此外,确实存在死锁的可能性,因为异步方法通常会尝试 return 其结果在阻塞等待结果的原始线程中。
- 使用
userProperties = await GetUserProperties(UserId).;
。但是,这在 属性 setter 中是不允许的(不能是异步的)。参见 Await an async function from setter property
因此,如果您想异步获取 UserProperties,您应该为此放弃 属性,创建 'GetUserProperties' 方法 public 并直接调用它,而不是使用 属性 getter.
如果你这样做,我认为最好将 UserProperties 也设置为异步方法并完全放弃 属性。