我让我现有的一些方法异步,现在在我调用这些方法的属性中,我看到了错误:
无法隐式转换'System.Threading.Tasks.Task<System.Collections.Generic.List<MyProj.BLL.Property>gt;TO’System.Collections.Generic.List<MyProj.BLL.Property>gt;
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"是一个异步方法,它返回一个(awaitable(Task。如果您需要该任务中的计算结果,有两种可能性:
- 使用
userProperties = GetUserProperties(UserId).Result;
这是毫无意义的,因为Result会阻塞您的线程,直到被调用的Task返回其结果。因此,实际上您使调用同步运行。此外,还存在死锁的实际可能性,因为异步方法通常试图在被阻塞等待结果的原始线程中返回其结果。
- 使用
userProperties = await GetUserProperties(UserId).;
。但是,这在属性setter(不能是异步的(中是不允许的。请参阅从setter属性Await异步函数
因此,如果您想异步获取UserProperties,则应为此放弃属性,将"GetUserProperties"方法公开并直接调用它,而不是使用属性getter。
如果你这样做,我认为最好将UserProperties设置为异步方法,并完全放弃该属性。