Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从不同线程更新ASP.NET web表单?_C#_Asp.net_Multithreading_Webforms - Fatal编程技术网

C# 如何从不同线程更新ASP.NET web表单?

C# 如何从不同线程更新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

在过去的几天里,我一直在努力学习如何将ASP.NET Web表单与多线程结合使用,通过使用两者构建一个简单的小程序,我一直在努力解决不同线程和UI之间交互的问题

我已经解决了其他一些问题中的一些多线程问题(并且在waaaaaay太久之后也了解到web表单和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);
    }
}
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可以帮助您