C# 如何从不同线程更新ASP.NET web表单?
在过去的几天里,我一直在努力学习如何将ASP.NET Web表单与多线程结合使用,通过使用两者构建一个简单的小程序,我一直在努力解决不同线程和UI之间交互的问题 我已经解决了其他一些问题中的一些多线程问题(并且在waaaaaay太久之后也了解到web表单和WPF不是一回事),但是现在我很难找到基于多线程中获取的数据更新UI元素的最佳方法 这是我的密码: Default.aspxC# 如何从不同线程更新ASP.NET web表单?,c#,asp.net,multithreading,webforms,C#,Asp.net,Multithreading,Webforms,在过去的几天里,我一直在努力学习如何将ASP.NET Web表单与多线程结合使用,通过使用两者构建一个简单的小程序,我一直在努力解决不同线程和UI之间交互的问题 我已经解决了其他一些问题中的一些多线程问题(并且在waaaaaay太久之后也了解到web表单和WPF不是一回事),但是现在我很难找到基于多线程中获取的数据更新UI元素的最佳方法 这是我的密码: Default.aspx public partial class _Default : System.Web.UI.Page { pr
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);
}
}
public分部类\u默认值:System.Web.UI.Page
{
私有NlSearch(用户搜索);;
专用静态int_计数器=0;
私有静态SortedList resultsList=新建SortedList();
受保护的无效页面加载(对象发送方、事件参数e)
{
_search=新的NlSearch();
}
受保护的void AddSearchMethod(对象发送方,EventArgs e)
{
var text=SearchForm.text;
新任务(()=>MakeRequest(文本));
}
受保护的void UpdateMethod(对象发送方、事件参数)
{
resultsLabel.Text=“”;
foreach(resultsList.Values中的变量v)
{
结果label.Text+=v.SearchTerm+“:“+v.Count+”发生率
”;
}
}
受保护的void ClearSearchMethod(对象发送方,事件参数e)
{
resultsLabel.Text=“”;
resultsList.Clear();
}
受保护的void生成请求(字符串文本)
{
_计数器++;
SearchResult s=新的SearchResult
{
SearchTerm=文本,
Count=\u search.MakeRequests(文本)
};
结果列表。添加(_计数器,s);
}
}
我已经尝试了很多版本的相同的基本东西。NlSearch.MakeRequest(由MakeRequests调用)模仿搜索栏输入向外部网站发送HTTP POST请求,然后从标记中提取一个整数,指示返回的结果数量
当前的简单UI围绕SearchForm文本字段、“添加搜索”按钮、“更新标签”按钮、“清除搜索”方法和显示结果的ResultsLabel展开。AddSearch按钮创建一个调用MakeRequest的新任务,该任务调用该方法发送HTTP请求,然后将结果按发送顺序存储在静态排序列表中
因此,理想情况下,在一个好的UI中,我希望每次线程返回时都更新标签,但是我尝试使用ContinueWheall和其他一些任务函数,问题似乎是其他线程没有能力更改UI
我还尝试在页面加载上运行一个新线程,每隔几秒钟更新一次标签,但同样失败了
因为我没有能够正确地实现这一点,我不得不使用“更新标签”按钮,它实际上只是告诉标签显示静态列表中当前的内容。我真的很想去掉这个按钮,但我不知道如何让我的线程进行UI更改。你以前听说过AJAX吗?我认为您是作为应用程序开发人员而不是web开发人员进行思考的。您以前听说过AJAX吗?我认为您的想法是作为应用程序开发人员而不是web开发人员。如果您想异步运行代码,您可能需要使用
Async wait
关键字,而不是自己管理线程
不要让线缠在一起;) 如果要异步运行代码,您可能需要使用
Async wait
关键字,而不是自己管理线程
不要让线缠在一起;) 一般来说,尝试在web应用程序中执行线程是个坏主意。Web服务器就是为此而设计的,但是如果可能的话,应该避免剥离新的线程或进程。虽然过去有一种机制(也许现在仍然有)将结果“推送”给客户,但现在有更好的解决方案
您所描述的正是AJAX想要解决的问题。一般来说,尝试在web应用程序中执行线程是个坏主意。Web服务器就是为此而设计的,但是如果可能的话,应该避免剥离新的线程或进程。虽然过去有一种机制(也许现在仍然有)将结果“推送”给客户,但现在有更好的解决方案
您所描述的正是AJAX想要解决的问题。您在问题中提到了WPF——您是否正在寻找Windows应用程序,比如WinForms?我认为“网络表单”一词可能混淆了这种情况。Web表单只是添加了一些(好的,很多)Microsoft功能的网页
听起来好像您正试图从代码中的线程向网页发送更新。网络不是这样工作的。如果你真的想设计网页,我建议你通读一下。其他答案建议使用AJAX功能(即网页执行一些JavaScript并与web服务器进行对话的地方)。您在问题中提到了WPF——您是否正在寻找Windows应用程序,如WinForms?我认为“网络表单”一词可能混淆了这种情况。Web表单只是添加了一些(好的,很多)Microsoft功能的网页
听起来好像您正试图从代码中的线程向网页发送更新。网络不是这样工作的。如果你真的想设计网页,我建议你通读一下。其他答案建议使用AJAX功能(这是网页执行一些JavaScript并与web服务器对话的地方)。我听说过,但没有使用过它。你说的应用程序开发而不是web开发是什么意思?是的,web是无状态的,通常你使用会话来维护web应用程序的状态。在您的特定情况下,AJAX可以帮助您