在带有参数的新线程中运行方法

时间:2018-08-15 12:20:16

标签: c# asp.net-core

我有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<>并不适合

3 个答案:

答案 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

构建异步管道