如何使用线程在C#中的一次发送多个Web请求?(How can you use threading

2019-10-18 10:18发布

我有一个简单的ASP.NET的小程序,和我想学习基本的多线程处理,使其运行更加平稳。

比方说,我迷上了以下方法按钮:

private NlSearch search;

protected void SearchButtonClick(object sender, EventArgs e)
    {

        int resultCount = search.MakeRequests(SearchForm.Text);
        resultsLabel.Text += SearchForm.Text + ": " + resultCount.ToString() + "     occurances";
    }

所有MakeRequests确实是发出一个POST请求做在第三方网站上搜索,并抓住从响应的结果数。 然后用结果的数量以及搜索词被添加到页面。

但是,如果我是做类似提交新的搜索第一搜索回应之前,它只会中断原来的搜索,只有最近搜索会写它的结果的标签。

我知道有一种方法用C#线程要做到这一点,但我无法弄清楚如何正确使用任务做到这一点。 我试图把方法的身体成第二种方法不带任何参数,我再用于创建和运行任务,但让我觉得我是用正确的任务,这并没有改变行为。

任何帮助或建议,将不胜感激,谢谢。

编辑:我试过到目前为止:两个答案似乎是“工作”,在检索值,但由于某种原因,没有真正将它们添加到标签的某些原因。 例如

protected void NewSearchClick(object sender, EventArgs e)
    {
        new Thread(() => MakeRequest(SearchForm.Text)).Start();
    }

protected void MakeRequest(string text)
    {
            int resultCount = search.MakeRequests(text);
            if (resultsLabel != null) resultsLabel.Text += text + ": " + resultCount + "     occurances";
    }

似乎检索值但标签不会改变。

Answer 1:

在一个WPF应用程序,你应该使用两个线程与调度员,因为只有UI线程可以写入标签。 更具体地讲,你应该使用的调度员作为回调,当任务完成后以更新UI事情:

protected void SearchButtonClick(object sender, EventArgs e)
{
    new Thread(() => MakeRequest(SearchForm.Text)).Start();
}

protected void MakeRequest(string text)
{
    int resultCount = search.MakeRequests(text);

    // tell UI thread to update label
    Dispatcher.BeginInvoke(new Action(() =>
            {
                resultsLabel.Text += text + ": " + resultCount + "     occurances";
            }));
}

EDIT1:使用调度不仅仅是线程

EDIT2:同时使用调度和线程



Answer 2:

因为他们所管理的线程池为你我会用.NET任务。

LINK: 任务[托管并行]

protected void SearchButtonClick(object sender, EventArgs e)
{
   var text = SearchForm.Text;
   Task.Factory.StartNew(() => 
   {
      var resultCount = search.MakeRequests(text);
      resultsLabel.Text += text + ": " + resultCount + "     occurances";
   });
}


文章来源: How can you use threading to send multiple web requests at a time in c#?