Ser*_*eit 7 linq parallel-processing asp.net-mvc c#-4.0 asp.net-mvc-3
我有在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);
}
Run Code Online (Sandbox Code Playgroud)
我认为containing和tagged查询可以完美并行运行.
同时触发这两个查询的最佳方法是什么,等待结果,并且仅在两个查询完成时返回?
任务Parallels库是您的最佳选择.通过Google获取大量信息,但下面是您的实施可能的样子.
[HttpPost]
public ActionResult Search(string query, int pg = 0)
{
var keywords = query.Split(new[] { ' ', ',', ';' },
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,
Containing = containing.ToList(),
Tagged = tagged.ToList()
};
return View(model);
}
Run Code Online (Sandbox Code Playgroud)
请记住,如果您的应用程序收到大量请求,您可能最好不要异步执行查询 - 消耗2个额外的线程来为一个请求提供服务会使资源远离其他传入请求.如果您拥有大量流量,或者您的硬件不足,这只会是一个问题.
| 归档时间: |
|
| 查看次数: |
4303 次 |
| 最近记录: |