【问题标题】:Breakpoint not hitting after .Wait().Wait() 后断点未命中
【发布时间】:2018-08-06 10:50:42
【问题描述】:

我有一个 .net web api 2 方法,我试图让我的代码的某些部分在一个单独的线程中执行某些操作,但是在我在任务上调用 .Wait() 方法之后它永远不会到达下一行。我一定是在俯瞰什么,但我似乎找不到它。这是该问题的一个非常简单的版本。行 Ok() 永远不会被击中。有什么建议吗?

public IHttpActionResult Get() {

    var attachTask = AttachNewTasksAsync();

    //do something else

    attachTask.Wait();

    return Ok();
}

public async System.Threading.Tasks.Task AttachNewTasksAsync()
{
    await System.Threading.Tasks.Task.Delay(10000);
}

【问题讨论】:

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


【解决方案1】:

死锁。您的主线程正在等待attachTask 完成,而attachTask 无法完成,因为它正在等待主线程。

要么将ConfigureAwait(false) 添加到Task.Delay,要么正确执行并等待attachTask

应该这样写:

public async Task<IHttpActionResult> Get() {

    var attachTask = AttachNewTasksAsync();

    //do something else

    await attachTask;

    return Ok();
}

如何保证即使有人同步等待也不会发生死锁?使用ConfigureAwait(false)

public async System.Threading.Tasks.Task AttachNewTasksAsync()
{
    await System.Threading.Tasks.Task.Delay(10000).ConfigureAwait(false);
}

Stephen Cleary 的博客中可能没有我能写的东西,所以我将把这个link 留在这里。

【讨论】:

  • 这是正确的,在 ASP.Net 中显式阻塞线程会导致死锁
  • 很好的答案!我还需要用完我的每日投票限额
  • 即使ConfigureAwait(false) 也可能无济于事,这不是硬约束,它是配置await 的软指标
  • 非常感谢,很难找到一个不混淆语法的像样的例子
猜你喜欢
  • 1970-01-01
  • 2018-07-17
  • 2011-08-28
  • 2011-12-01
  • 2010-10-13
  • 2019-03-29
  • 2019-10-02
  • 2017-10-16
  • 2014-03-02
相关资源
最近更新 更多