异步/等待呼叫没有返回。强制同步

时间:2014-10-07 08:02:35

标签: c# entity-framework asynchronous async-await asp.net-web-api

我遇到了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;
}

以下是一些观察和额外信息:

  • 该服务与EF6上的存储库进行通信并获取内容 数据库async.SingleOrDefaultAsync())。
  • 角度服务会触发请求,并在网络标签中保持待处理状态。此外,如果您导航到该页面,则什么也得不到。其他时候你没等到达线后没有任何反应。也没有例外。
  • 如果我调试服务(具有await关键字)并且我逐步完成 代码它有时'只是工作',我从数据库中获取数据 一切都很好。
  • 使用Ninject的InRequestScope()
  • 注入Service和DataContext

最奇怪的是,当我最后一次冲刺发布时,我可以发誓这是有效的。我有什么想法可以解决这个问题吗?

修改

这是服务:

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);
}

1 个答案:

答案 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}} 存储库