在过去的几天里,我一直试图通过使用两者来构建一个简单的applet来学习如何将ASP.NET Web Forms与多线程一起使用,并且我一直在努力解决不同线程之间的交互问题。用户界面。
我已经在其他一些问题中解决了一些多线程问题(并且在网络表单和WPF不同的情况下花了很长时间才学会了)但是现在我遇到了找到更新UI元素的最佳方法的麻烦在多线程中获取的数据。
这是我的代码:
Default.aspx的
public partial class _Default : System.Web.UI.Page
{
private NlSearch _search;
private static int _counter = 0;
private static SortedList<long, SearchResult> resultsList = new SortedList<long, SearchResult>();
protected void Page_Load(object sender, EventArgs e)
{
_search = new NlSearch();
}
protected void AddSearchMethod(object sender, EventArgs e)
{
var text = SearchForm.Text;
new Task(() => MakeRequest(text));
}
protected void UpdateMethod(object sender, EventArgs e)
{
resultsLabel.Text = "";
foreach (var v in resultsList.Values)
{
resultsLabel.Text += v.SearchTerm + ": " + v.Count + " occurances<br/>";
}
}
protected void ClearSearchMethod(object sender, EventArgs e)
{
resultsLabel.Text = "";
resultsList.Clear();
}
protected void MakeRequest(string text)
{
_counter++;
SearchResult s = new SearchResult
{
SearchTerm = text,
Count = _search.MakeRequests(text)
};
resultsList.Add(_counter, s);
}
}
我尝试过相同基本的相当多的版本。 NlSearch.MakeRequest(由MakeRequests调用)向模仿搜索栏输入的外部网站发送HTTP POST请求,然后从标记中提取一个整数,表示返回了多少结果。
当前简单的UI围绕SearchForm文本字段,“添加搜索”按钮,“更新标签”按钮,“清除搜索”方法和显示结果的ResultsLabel。 AddSearch按钮创建一个调用MakeRequest的新任务,该任务调用该方法发送HTTP请求,然后按照它们在静态排序列表中发送的顺序存储结果。
所以现在理想情况下在一个好的UI中我想每次线程返回时更新标签,但我尝试使用ContinueWhenAll和一些其他任务函数,问题似乎是其他线程没有能够改变UI。
我还尝试在页面加载上运行一个新线程,每隔几秒钟更新一次标签,但这同样失败了。
因为我无法正确实现这一点,所以我不得不使用“更新标签”按钮,它只是告诉标签显示当前静态列表中的内容。我真的想摆脱这个按钮,但我不知道如何让我的线程进行UI更改。
答案 0 :(得分:2)
一般来说,尝试在网络应用中进行线程化是一个坏主意。 Web服务器就是为此而设计的,但是如果可能的话,应该避免剥离新的线程或进程。虽然曾经有一种机制(可能仍有)将结果“推送”给客户,但现在有更好的解决方案。
您所描述的正是AJAX旨在解决的问题。
答案 1 :(得分:2)
你在提问中提到了WPF - 你是否可能正在寻找像WinForms这样的Windows应用程序?我认为也许“网络形式”一词使情况混乱。 Web表单只是在Microsoft功能中添加了一些(好的,很多)的网页。
听起来你正试图从代码中的线程向网页发送更新。网络无法正常工作。如果您真的想设计网页,我建议您阅读ASP.NET Page Life Cycle Overview。其他答案提出了AJAX功能(这是网页执行一些JavaScript并与Web服务器通信的地方)。
答案 2 :(得分:0)
你以前听说过AJAX吗?我认为你是一个思考应用程序dev而不是web dev。
答案 3 :(得分:0)
如果要异步运行代码,可能需要使用Async Await
关键字而不是自己管理线程。 See information about Asynchronous Programming with Async and Await
不要让你的线程纠结;)