【问题标题】:Async MVC5 controller and async EF DataContext异步 MVC5 控制器和异步 EF DataContext
【发布时间】:2014-07-04 08:54:34
【问题描述】:

我正在阅读很多文章并看到了 mvc 项目的示例,但无法找到我的问题的答案,请帮助我。

问题: 我有异步 mvc5 应用程序的简单示例,但我不明白下划线会发生什么,哪个版本是正确的,为什么?十分感谢。

示例

public class HomeController : Controller
{
    [HttpGet]
    public async Task<JsonResult> NamesAsync()
    {
        var result = await new TestService().GetNamesAsync();
        return Json(result,JsonRequestBehavior.AllowGet);
    }

    public async Task<JsonResult> Names()
    {
        var result = await new TestService().GetName();
        return Json(result, JsonRequestBehavior.AllowGet);
    }

}

public sealed class TestService
{
    public async Task<List<string>> GetNamesAsync()
    {
        return await new DataLayer().GetNamesAsync();
    }

    public Task<List<string>> GetName()
    {
        return Task<List<string>>.Factory.StartNew(() => new DataLayer().GetNames());
    }
}


public sealed class DataLayer
{
    public async Task<List<string>> GetNamesAsync()
    {
        using (var context = new TestContext())
        {
            return await context.Names.Select(x => x.NameText).ToListAsync();
        }
    }

    public List<string> GetNames()
    {
        var tcs = new TaskCompletionSource<List<string>>();

        Task.Factory.StartNew(() =>
        {
            using (var context = new TestContext())
            {
                var names = context.Names.Select(x => x.NameText).ToList();
                tcs.SetResult(names);
            }
        });

        Task.WhenAll(tcs.Task);

        return tcs.Task.Result;
    }
}

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-5


    【解决方案1】:

    异步代码的一条规则是“不要让代码撒谎”。有一些操作(尤其是 I/O)本质上是异步的,它们应该公开异步 API。

    数据库受 I/O 限制,因此它们属于自然异步类别:

    public class HomeController : Controller
    {
        [HttpGet]
        public async Task<JsonResult> NamesAsync()
        {
            var result = await new TestService().GetNamesAsync();
            return Json(result,JsonRequestBehavior.AllowGet);
        }
    }
    
    public sealed class TestService
    {
        public async Task<List<string>> GetNamesAsync()
        {
            return await new DataLayer().GetNamesAsync();
        }
    }
    
    public sealed class DataLayer
    {
        public async Task<List<string>> GetNamesAsync()
        {
            using (var context = new TestContext())
            {
                return await context.Names.Select(x => x.NameText).ToListAsync();
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2012-10-14
      • 2017-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-19
      相关资源
      最近更新 更多