gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 10:30:16 24 4
gpt4 key购买 nike

我在 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);
}

我认为 containingtagged查询可以完美地并行运行。

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

最佳答案

Task 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);
}

请记住,如果您的应用程序收到大量请求,最好不要异步执行查询 - 消耗 2 个额外线程来处理一个请求会占用其他传入请求的资源。如果您的流量很大,或者您的硬件不足,这只会是一个问题。

关于asp.net-mvc - 在 ASP.NET MVC 3 Action 方法中并行运行任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5574181/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com