【发布时间】:2018-08-15 21:10:33
【问题描述】:
我有 asp.net 核心控制器,它从 View 获取数据并使用它进行搜索
这是控制器代码
private readonly GettingWords _repository;
public HomeController(GettingWords repository){
_repository = repository;
}
[HttpPost]
public JsonResult SearchWord([FromBody] RequestModel model){
var result = _repository.GettingWord(model.word, model.adress);
return Json(result);
}
这是它调用的方法
public class GettingWords
{
public string GettingWord(string word, string adress)
{
string result;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(adress);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream receiveStream = response.GetResponseStream();
StreamReader readStream = null;
if (response.CharacterSet == null)
{
readStream = new StreamReader(receiveStream);
}
else
{
readStream = new StreamReader(receiveStream, Encoding.GetEncoding(response.CharacterSet));
}
string data = readStream.ReadToEnd();
string pattern = word;
// Instantiate the regular expression object.
Regex r = new Regex(pattern, RegexOptions.IgnoreCase);
// Match the regular expression pattern against your html data.
Match m = r.Match(data);
if (m.Success)
{
result = "Word " + word + " finded in " + adress;
}
else
{
result = "Word not finded";
}
response.Close();
readStream.Close();
return result;
}
}
我需要使用这两个参数在新线程中运行 GettingWord。我怎样才能正确地做到这一点?
更新
我还需要设置最大线程数,所以我认为 Task<> 不适合这个
【问题讨论】:
-
你应该使用
HttpClient类和GetAsync,GettingWord应该声明为public async Task<string> GetWordAsync(string word, string adress) -
好的。但我也需要声明最大线程数,所以异步任务可能不适合这个? @CamiloTerevinto
-
不,您根本不需要设置最大线程数。你认为你需要另一个线程,你不需要。使用适当的异步模式,而不是尝试强制使用线程模型
-
你认为你会赢得什么?仅仅为了创建线程而创建线程不会让您的应用程序更快
-
为什么需要在新线程中运行它?在等待“新线程”完成时,原始线程会做什么?正如@CamiloTerevinto 指出的那样,您应该异步并等待。任务非常适合这种情况。因为等待网络请求不需要线程。任务将允许线程在其他地方使用,直到 Web 请求返回。使用适当的异步模式将意味着您创建 0 个额外线程,因此无需担心最大线程数
标签: c# asp.net-core