.Wait()之后断点未命中

时间:2018-08-06 10:50:43

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

我有一个.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);
}

1 个答案:

答案 0 :(得分:8)

死锁。您的主线程正在等待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保留。