我遇到了Async / Await的问题,我无法理解。
以下代码位于WebAPI控制器中:
这有效(强制通过.Result
进行同步)
public async Task<HttpResponseMessage> Get(long id)
{
var distribution = this.Service.GetById(id).Result;
var result = distribution == null ?
Request.CreateResponse(HttpStatusCode.NotFound) :
Request.CreateResponse(
HttpStatusCode.OK,
distribution.AsViewModel(identity));
return result;
}
这不(使用等待)
public async Task<HttpResponseMessage> Get(long id)
{
var distribution = await this.Service.GetById(id);
var result = distribution == null ?
Request.CreateResponse(HttpStatusCode.NotFound) :
Request.CreateResponse(
HttpStatusCode.OK,
distribution.AsViewModel(identity));
return result;
}
以下是一些观察和额外信息:
async
(.SingleOrDefaultAsync()
)。 await
关键字)并且我逐步完成
代码它有时'只是工作',我从数据库中获取数据
一切都很好。InRequestScope()
最奇怪的是,当我最后一次冲刺发布时,我可以发誓这是有效的。我有什么想法可以解决这个问题吗?
修改
这是服务:
public Task<Distribution> GetById(long id)
{
return this._distributionRepository.GetById(id);
}
这是存储库:
public Task<Distribution> GetById(long id)
{
return this.DataContext.Distributions.SingleAsync(d => d.Id == id);
}
答案 0 :(得分:0)
正如我在评论中提到的,await
this.Service.GetById(id)
GetById
您应该声明async
方法public async Task<HttpResponseMessage> Get(long id)
{
var distribution = await this.Service.GetByIdAsync(id);
var result = distribution == null ?
Request.CreateResponse(HttpStatusCode.NotFound) :
Request.CreateResponse(
HttpStatusCode.OK,
distribution.AsViewModel(identity));
return result;
}
和all the way down it should be async
。
所以你的代码应该是这样的
<强>控制器强>
public async Task<Distribution> GetByIdAsync(long id)
{
return await this._distributionRepository.GetByIdAsync(id);
}
<强>服务强>
public async Task<Distribution> GetByIdAsync(long id)
{
return await this.DataContext.Distributions.SingleAsync(d => d.Id == id);
}
<强>存储库强>
async
我还建议您遵循async
方法约定并将GetById
添加到您的异步方法中,因此您应该在服务中将GetByIdAsync
方法重命名为{{1}} 和存储库。