如何以与多线程web应用程序中的查询结果相同的顺序显示查询结果

本文关键字:结果 查询 显示 顺序 多线程 应用程序 web | 更新日期: 2023-09-27 18:24:59

我在这里询问了一些关于在简单的ASP.NET Windows窗体小程序中使用多线程以加快搜索速度的帮助,得到了一些很好的答案。然而,由于在这个应用程序上使用线程(而且没有太多经验),我遇到了一些新的设计问题。

我编写了一个简单的小程序,它向第三方网站发送POST请求以使用其搜索栏,然后返回从页面上的字符串中提取的整数,该字符串指示为给定搜索项找到了多少结果。

public partial class _Default : System.Web.UI.Page
{
    private NlSearch search;
    private static List<SearchResult> resultsList = new List<SearchResult>(); 
    protected void Page_Load(object sender, EventArgs e)
    {
        search = new NlSearch();
    }
    protected void AddSearchMethod(object sender, EventArgs e)
    {
        var text = SearchForm.Text;
        Task task = Task.Factory.StartNew(() => MakeRequest(text));
        task.Wait();
        resultsLabel.Text = "";
        foreach (var v in resultsList)
        {
            resultsLabel.Text += v.SearchTerm + ": " + v.Count + " occurances<br/>";
        }
    }
    protected void ClearSearchMethod(object sender, EventArgs e)
    {
        resultsLabel.Text = "";
        resultsList.Clear();
    }
    protected void MakeRequest(string text)
    {
        SearchResult s = new SearchResult
        {
            SearchTerm = text,
            Count = 0
        };
        resultsList.Add(s);
        s.Count = search.MakeRequests(text);
    }
}

AddSearchMethod和ClearSearchMethod对应于"添加搜索"answers"清除搜索"按钮,并与SearchForm文本字段和resultsLabel标签交互。

所需的行为是:

  1. 客户端可以在SearchForm字段中输入一个搜索词,然后提交,应用程序将运行搜索,将结果添加到resultsList中,然后将列表的内容写入resultsLabel,这将按预期工作。

  2. 我希望客户能够在SearchForm中提交尽可能多的搜索词,然后按照制作顺序将其写入列表。对HTTP请求的响应非常慢,这大大提高了可用性。

我遇到了很多关于#2的问题。在收到响应之前,您可以提交任意数量的搜索词,但响应非常慢,而且似乎会随着请求数量的增加而增加,这表明它们不是同时运行的。这也未能保留顺序,因此,如果我按"1990"1991"1992"1993"的顺序输入搜索词,它们将按收到回复的顺序显示,而不是按发出的顺序显示

由于不太了解web应用程序的线程处理,我真的不知道如何解决这些问题。

编辑:似乎也有一些请求丢失。例如,如果我按"boston1"到"boston10"的顺序输入,则输出为

boston1: 302 occurances
boston3: 265 occurances
boston2: 227 occurances
boston: 10220056 occurances
boston7: 389 occurances
boston10: 109 occurances

如何以与多线程web应用程序中的查询结果相同的顺序显示查询结果

只需使用排序列表,并使用静态请求ID号跟踪您的请求。

private static SortedList<long, SearchResult> resultsList = new SortedList<long, SearchResult>();
...
    foreach (var v in resultsList.Values)
    {
...
public static long RequestID = 0;
protected void MakeRequest(string text)
{
    SearchResult s = new SearchResult
    {
        SearchTerm = text,
        Count = 0
    };
    resultsList.Add(System.Threading.Interlocked.Increment(ref RequestID), s);