加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – 在ASP.NET MVC 3 Action方法中并行运行任务

发布时间:2020-12-16 04:19:23 所属栏目:asp.Net 来源:网络整理
导读:我在ASP.NET MVC 3应用程序中有一个搜索操作,它返回包含给定关键字的建议和建议: [HttpPost]public ActionResult Search(string query,int pg = 0){ var keywords = query.Split(new[] { ' ',',';' },StringSplitOptions.RemoveEmptyEntries); var containi
我在ASP.NET MVC 3应用程序中有一个搜索操作,它返回包含给定关键字的建议和建议:
[HttpPost]
public ActionResult Search(string query,int pg = 0)
{
    var keywords = query.Split(new[] { ' ',',';' },StringSplitOptions.RemoveEmptyEntries);

    var containing = (from s in _readonlySession.All<Suggestion>()
                      from k in keywords
                      where (s.Text.ToLower().Contains(k.ToLower()))
                      orderby s.Text
                      select s).Distinct();

    var tagged = (from t in _readonlySession.All<Tag>()
                  from s in t.Suggestions
                  from k in keywords
                  where t.Text.ToLower().Contains(k.ToLower())
                  orderby s.Text
                  select s).Distinct();

    var model = new SearchViewModel
    {
        Query = query,Containing = containing.ToList(),Tagged = tagged.ToList()
    };

    return View(model);
}

我认为包含和标记的查询可以完美地并行运行.

同时触发这两个查询的最佳方法是什么,等待结果,并且仅在两个查询完成时返回?

解决方法

任务Parallels库是您的最佳选择.通过Google获取大量信息,但下面是您的实施可能的样子.
[HttpPost]
public ActionResult Search(string query,StringSplitOptions.RemoveEmptyEntries);

    IEnumerable containing=null;
    Task t1 = Task.Factory.StartNew(() =>
    {
        containing = (from s in _readonlySession.All<Suggestion>()
                        from k in keywords
                        where (s.Text.ToLower().Contains(k.ToLower()))
                        orderby s.Text
                        select s).Distinct().ToList();

    });

    IEnumerable tagged=null;
    Task t2 = Task.Factory.StartNew(() =>
    {
        var tagged = (from t in _readonlySession.All<Tag>()
                        from s in t.Suggestions
                        from k in keywords
                        where t.Text.ToLower().Contains(k.ToLower())
                        orderby s.Text
                        select s).Distinct().ToList();
    });

    t1.Wait();
    t2.Wait();

    var model = new SearchViewModel
    {
        Query = query,Tagged = tagged.ToList()
    };

    return View(model);
}

请记住,如果您的应用程序收到大量请求,您可能最好不要异步执行查询 – 消耗2个额外的线程来为一个请求提供服务会使资源远离其他传入请求.如果您有大量流量,或者您的硬件不合适,这只会是一个问题.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读