【问题标题】:Task.WaitAll hangs in webapi callTask.WaitAll 在 webapi 调用中挂起
【发布时间】:2017-08-21 20:27:55
【问题描述】:

从客户端(AngularJS)在 webapi“测试”下面调用。它执行 Line1、Line2 和 Line3 但它挂在 Line3 并且从未移动到 Line4 并且如果在单元测试项目的单元测试中执行相同的 Line1、Line2 和 Line3 执行良好。谁能帮忙看看这里出了什么问题?

    [Route("Test")]
    [HttpGet]
    public IHttpActionResult Test(string input)
    {

        var taskA = Dump(a, b); //Line1
        var taskB = Dump(c, d); //Line2
        Task.WaitAll(taskA, taskB); //Line3

        Line4;
        Line5;
        Line6;

        Ok(success);

    }

转储方法:

     public async Task Dump(string x, string y)
    {
        await Task.Run(() => methodToDump(x, y));
    }

【问题讨论】:

  • 标记方法 async 并使用 await Task.WhenAll(taskA, taskB); 您还需要将返回类型更改为 Task<IHttpActionResult> 或其他异步等效项。
  • [Route("Test")] [HttpGet] public async Task<IHttpActionResult> Test(string input) { var taskA = Dump(a, b); //Line1 var taskB = Dump(c, d); //Line2 await Task.WhenAll(taskA, taskB); //Line3 Line4; Line5; Line6; Ok(success); }
  • 它给出了相同的结果。挂在 Line3。我只想在 Line1 和 Line2 开始的任务完成后才执行 Line4
  • 使用await,您的方法不会在第3行挂起,它将控制权返回给调用者,并且仅在WhenAll中的所有任务完成后才执行以下行

标签: .net c#-4.0 asp.net-web-api async-await


【解决方案1】:

您还需要将转储功能更改为

public async Task Dump(string x, string y)
{
    await Task.Run(() => methodToDump(x, y)).ConfigureAwait(false);
}

await 后没有代码,所以不需要在捕获的 SynchronizationContext 上强制继续

【讨论】:

    【解决方案2】:

    您需要将api方法配置为异步并返回一个Task。

    这样实现

    [Route("Test")]
    [HttpGet]
    public async Task<IHttpActionResult> Test(string input)
    {
    
        var taskA = Dump(a, b); //Line1
        var taskB = Dump(c, d); //Line2
        await Task.WhenAll(taskA, taskB); //Line3
    
        Line4;
        Line5;
        Line6;
    
        Ok(success);
    }
    

    【讨论】:

    • WaitAll 仍处于阻塞状态,请将其换成 WhenAll
    • @JSteward 好的,谢谢。不知道那个。请编辑我的答案,你会因此而获得荣誉。
    • 谢谢,它与WhenAll一起工作。我之前指的是旧文件。
    猜你喜欢
    • 2012-10-10
    • 1970-01-01
    • 1970-01-01
    • 2018-10-18
    • 2019-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多