1

我有一个简单的 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 请求以在 3rd 方网站上进行搜索,并从响应中获取结果的数量。然后将搜索词与结果数量一起添加到页面中。

但是,如果我要在第一个搜索响应之前提交新搜索之类的操作,它只会中断原始搜索,并且只有最近的搜索会将其结果写入标签。

我知道有一种方法可以使用 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";
    }

似乎检索到了值,但标签没有改变。

4

2 回答 2

3

在 WPF 应用程序中,您应该同时使用线程和 Dispatcher,因为只有 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:使用 Dispatcher 而不仅仅是线程

Edit2:同时使用 Dispatcher 和线程

于 2013-07-24T19:27:16.127 回答
1

我会使用 .NET Task,因为他们会为您管理线程池。

链接:任务 [托管并行]

protected void SearchButtonClick(object sender, EventArgs e)
{
   var text = SearchForm.Text;
   Task.Factory.StartNew(() => 
   {
      var resultCount = search.MakeRequests(text);
      resultsLabel.Text += text + ": " + resultCount + "     occurances";
   });
}
于 2013-07-24T19:29:35.010 回答