C# 访问async.Result是否被视为不良做法?

C# 访问async.Result是否被视为不良做法?,c#,.net,asynchronous,C#,.net,Asynchronous,如果我有以下 public async Task<Owner> Get(int carId) { var car = await myDbContext.Cars.FindAsync(carId); return car.Owner; } 我无法访问第一行中的Owner属性,因为它是异步调用 如果我使用wait myDbContext.Cars.FindAsynccarId.Result.Owner访问它,这是否意味着我会在某个时候陷入死锁,或者它有

如果我有以下

  public async Task<Owner> Get(int carId)
  {
     var car = await myDbContext.Cars.FindAsync(carId);
     return car.Owner;
  }
我无法访问第一行中的Owner属性,因为它是异步调用


如果我使用wait myDbContext.Cars.FindAsynccarId.Result.Owner访问它,这是否意味着我会在某个时候陷入死锁,或者它有其他一些副作用?

当前代码和使用之间的差异。结果是,当前,get的调用方。。。方法将能够继续,直到等待自己


正在使用.Result获取。。。方法将在该点阻止任何调用方,直到结果可用为止,因此不鼓励使用该方法。

可能这取决于上下文正在执行的操作,但这被认为是不好的做法。为什么您不想使用上面的代码呢?如果您想要一行代码,只需简单地包装您的异步调用。。。return wait myDbContext.Cars.FindAsynccarId?所有者FindAsynccarId的返回类型是什么?假设这是一项任务,那么等待myDbContext.Cars.FindAsynccarId.Result.Owner不会进行类型检查。如果您询问如何将方法转换为一行代码,可以使用return wait myDbContext.Cars.FindAsynccarId.Owner;不知道为什么会关闭。标题中的问题有一个明确的答案。对问题底部的问题的答案可能是你会死锁,可能只是冻结UI,或者可能会发生其他不好的事情,或者可能不会发生任何不好的事情;你今天觉得有多幸运?。对可等待对象执行的正确操作是等待它。如果需要一行程序,可以使用一行程序:public async Task GetOwnerAsyncint c=>wait context.Cars.FindAsyncc.Owner;,完成。Wait是一个与任何其他运营商一样的运营商;它遵守括号规则。这是不鼓励它的一个原因,但更重要的原因是:正在同步等待的异步操作可能计划在将来在您刚才阻止的线程上执行。显然,线程将永远等待,因为它正在休眠,直到它在将来工作并唤醒自己,这是永远不会发生的。