需要解决asp.net异步控制器中的线程死锁情况

时间:2018-01-17 23:14:28

标签: c# mongodb async-await asp.net-mvc-5.2

假设我有一个通过.net mongo驱动程序调用Mongodb数据库的方法(下面提到的Collection对象是其Api的一部分):

    public virtual Task<List<T>> GetAllAsync()
    {
        return Collection.Find(Filter.Empty).ToListAsync();
    }

现在我有一个async asp.net控制器,我想从中调用这个方法。但是这个例子遇到了线程死锁问题,导致当前的asp.net线程挂起:

public class TestController : AsyncController
{
    [HttpGet]
    public async Task<ActionResult> TestAction()
    {
         var data = await GetAllAsync<Client>();
         ...
    }
}

虽然这个例子很好用:

public class TestController : AsyncController
{
    [HttpGet]
    public async Task<ActionResult> TestAction()
    {
         var data = await GetAllAsync<Client>().ConfigureAwait(false);
         ...
    }
}

唯一的区别是后一个例子中的ConfigureAwait(false)

我应该在这种情况下到处添加这个ConfigureAwait(false),还是有更优雅的解决方案?

更新: 如果我从头开始创建MVC项目,相同的操作方法可以正常工作,不会陷入死锁问题。虽然如果我使用迁移到新MVC的旧MVC项目,但在第一个示例中会出现死锁问题。不知道这两者之间有什么区别,我打开了packaged.config和bin目录,并确保使用相同版本的Microsoft.AspNet。*,C#代码是相同的。唯一不同的是旧解决方案预装了StructureMap和Cassette之类的东西,web.config中的某些不同设置也会影响控制器行为。

1 个答案:

答案 0 :(得分:0)

https://example.com/assets/images/foo.png?v=1.0. 不能用于操作方法,因为执行必须返回<!-- In your html --> https://example.com/assets/images/foo.png?v={{assetVersion}}. 之后的同步上下文。

应该使用任何其他方法ConfigureAwait(false)

如果某些代码在异步方法中同步阻塞,整个事情就会阻塞。