如何从不同的线程更新ASP.NET Web表单?

时间:2013-07-26 16:02:39

标签: c# asp.net multithreading webforms

在过去的几天里,我一直试图通过使用两者来构建一个简单的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更改。

4 个答案:

答案 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

不要让你的线程纠结;)