Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架在使用异步调用时挂起_C#_Entity Framework_Asynchronous_Asp.net Mvc 5.1 - Fatal编程技术网

C# 实体框架在使用异步调用时挂起

C# 实体框架在使用异步调用时挂起,c#,entity-framework,asynchronous,asp.net-mvc-5.1,C#,Entity Framework,Asynchronous,Asp.net Mvc 5.1,我不熟悉使用异步,这似乎让我无法理解原因或问题是什么,当我尝试加载网页时,异步调用似乎挂起,而页面从未加载。我在这里的实现是错误的吗 控制器 public ActionResult Index() { var model = _partyAddOnService.Get().Result.Select(x => new AddOnModel() { Id = x.Id, AddOnType = x.AddOnType, De

我不熟悉使用异步,这似乎让我无法理解原因或问题是什么,当我尝试加载网页时,异步调用似乎挂起,而页面从未加载。我在这里的实现是错误的吗

控制器

public ActionResult Index()
{

    var model = _partyAddOnService.Get().Result.Select(x => new AddOnModel()
    {
        Id = x.Id,
        AddOnType = x.AddOnType,
        Description = x.Description,
        Name = x.Name,
        Price = x.Price
    });

    return View(model);
}
服务

public async Task<IEnumerable<AddOn>> Get()
{
    return await _repository.GetAsync();
}
*调试和查看任务状态时,会显示“等待激活”

还尝试使用本文建议的ConfigureAwait方法。(见下文詹姆斯的评论)

公共异步任务Get() { 返回await\u repository.GetAsync().ConfigureAwait(false); }
您正在导致死锁,因为您没有一直实现异步等待模式。还可以在最低级别上使用.ConfigureAwait(false)

public async Task<ActionResult> Index()
{

    var model = await _partyAddOnService.Get().Result.Select(x => new AddOnModel()
    {
        Id = x.Id,
        AddOnType = x.AddOnType,
        Description = x.Description,
        Name = x.Name,
        Price = x.Price
    });

    return View(model);
}
公共异步任务索引()
{
var model=await\u partyAddOnService.Get().Result.Select(x=>newaddonmodel())
{
Id=x.Id,
AddOnType=x.AddOnType,
描述=x.描述,
Name=x.Name,
价格=x.价格
});
返回视图(模型);
}

要防止死锁,只需一直使用
async
。您已经在服务和存储库中使用了它,因此只需将其添加到控制器中即可:

public async Task<ActionResult> Index()
{
  var model = (await _partyAddOnService.Get()).Select(x => new AddOnModel()
  {
    Id = x.Id,
    AddOnType = x.AddOnType,
    Description = x.Description,
    Name = x.Name,
    Price = x.Price
  });

  return View(model);
}

公共异步任务。也就是说,
Get
应该是
GetAsync

您的代码是。如果要同步获取调用结果,为什么要使用async<代码>结果
阻塞。我想死锁是我的控制器?不知道如何修复。@usr是的,我读的越多,我就越意识到这一切都是浪费时间和精力。我将删除它,只需同步调用数据库。我没有任何方法依赖于对数据库的多次调用,EF根据FK自动返回我的子数据,因此我不需要多次调用。我只是想在我的代码架构中积极主动。该死的年轻开发者综合症。谢谢大家的帮助@yycdev这是个明智的选择。为什么这会被否决?作为一个试图学习和理解异步的人,我很想知道是否有什么不应该在这里做的事情?使用异步IO,然后阻塞,这一点是错误的,它会让你从两个世界中都得到最坏的结果@因为这个原因,你自己的代码也没有意义。
public async Task<IEnumerable<AddOn>> Get()
{
    return await _repository.GetAsync().ConfigureAwait(false);
}
public async Task<ActionResult> Index()
{

    var model = await _partyAddOnService.Get().Result.Select(x => new AddOnModel()
    {
        Id = x.Id,
        AddOnType = x.AddOnType,
        Description = x.Description,
        Name = x.Name,
        Price = x.Price
    });

    return View(model);
}
public async Task<ActionResult> Index()
{
  var model = (await _partyAddOnService.Get()).Select(x => new AddOnModel()
  {
    Id = x.Id,
    AddOnType = x.AddOnType,
    Description = x.Description,
    Name = x.Name,
    Price = x.Price
  });

  return View(model);
}