我问here在一个简单的ASP.NET Windows窗体小程序中使用多线程的一些帮助,使搜索运行得更快,并得到了一些好的答案。然而,由于在这个应用程序上使用线程(并没有太多的经验),我遇到了一些新的设计问题。
我编写了一个简单的applet,它向第三方网站发送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对应“添加搜索”和“清除搜索”按钮,并与SearchForm文本字段和resultsLabel标签进行交互。
理想的行为是:
客户端可以在SearchForm字段中输入单个搜索词,提交,应用程序将运行搜索,将结果添加到resultsList列表,然后将列表内容写入resultsLabel,按预期工作。
我希望客户能够在SearchForm中提交尽可能多的搜索字词,然后按照它们的顺序将它们写入列表。对HTTP请求的响应非常慢,这极大地提高了可用性。
我遇到了#2的很多问题。您可以在收到响应之前提交任意数量的搜索字词,但响应非常慢,并且似乎与请求数量一致,表明它们没有同时运行。这也无法保留订单,所以如果我按照“1990”“1991”1992“”1993“的顺序输入搜索条件,它们将按接收响应的顺序显示,而不是按顺序显示。< / p>
对网络应用程序的线程不太了解,我不确定如何解决这些问题。
编辑:似乎也有一些请求丢失。例如,如果我按顺序输入“boston1”到“boston10”,则输出为
boston1: 302 occurances
boston3: 265 occurances
boston2: 227 occurances
boston: 10220056 occurances
boston7: 389 occurances
boston10: 109 occurances
答案 0 :(得分:2)
只需使用已排序的列表,并使用静态请求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);