我有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<>
并不适合
答案 0 :(得分:1)
您的Getting Words类应该看起来像这样
public class GettingWords
{
private static HttpClient _client = new HttpClient();
public async Task<string> GettingWordAsync(string word, string adress)
{
string result;
string data = await _client.GetStringAsync(adress);
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";
}
return result;
}
}
并像这样使用
私有只读GettingWords _repository;
public HomeController(GettingWords repository){
_repository = repository;
}
[HttpPost]
public async Task<JsonResult> SearchWord([FromBody] RequestModel model){
var result = await _repository.GettingWordAsync(model.word, model.adress);
return Json(result);
}
答案 1 :(得分:1)
我能够通过此代码解决异步问题
public async Task<string> GettingWordAsync(string word, string adress)
{
HttpWebRequest req = WebRequest.CreateHttp(adress);
req.Method = "GET";
req.KeepAlive = true;
string result;
string content = null;
string pattern = word;
HttpStatusCode code = HttpStatusCode.OK;
try
{
using (HttpWebResponse response = (HttpWebResponse)await req.GetResponseAsync())
{
using (StreamReader sr = new StreamReader(response.GetResponseStream()))
content = await sr.ReadToEndAsync();
}
}
catch (WebException ex)
{
using (HttpWebResponse response = (HttpWebResponse)ex.Response)
{
using (StreamReader sr = new StreamReader(response.GetResponseStream()))
content = sr.ReadToEnd();
code = response.StatusCode;
}
}
// 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(content);
if (m.Success)
{
result = "Word " + word + " finded in " + adress;
}
else
{
result = "Word not finded";
}
return result;
}
}
答案 2 :(得分:0)
@Eugene之前有关异步任务的注释有效。 如果您需要对任务计数进行更多控制,则可以在线程池中设置最大数量,或以任何方式更改默认TaskScheduler(例如,可以在here中找到详细信息)。 我不建议这样做。有人真的需要那个,这很后头。看来您的情况可能是不正确/不清楚的业务任务。 如果确定确实需要为该服务全局设置最大线程数,请考虑使用TPL Dataflow
构建异步管道