【问题标题】:Update Web Application UI from a IP callback in a different thread (ASP.NET and C#)从不同线程中的 IP 回调更新 Web 应用程序 UI(ASP.NET 和 C#)
【发布时间】:2016-12-22 23:38:53
【问题描述】:

我正在使用 ASP.NET 和 C# 编写 Web 应用程序。

当页面加载时,它必须侦听(IP 连接),当它收到消息时,应该使用该值更新标签(从回调更新 UI)。 简化我的代码,我在主页上有这个:

protected void Page_Load(object sender, EventArgs e)
    {
        Thread listeningThread = new Thread(new ThreadStart(StartListening));
        listeningThread.Start();
    }

这是 aspx 文件中的标签:

<asp:Label ID="MyLabel" runat="server" EnableViewState="False"></asp:Label>

然后,这是我的回调函数:

private void StartListening()
    {
        Action<string> callbackRead = (string message) =>
        {
            myLabel.text = message;
        };
    }

消息正确到达,如果我在回调中放置一个断点,我可以看到它是如何进入其中的。尽管如此,UI 并未更新。当然,如果我写 myLabel.text = "Whatever";在 Page_Load 部分,它工作正常。

我已经尝试过使用网格和 DataSource + DataBind()(我遵循了 this 教程),但我仍然遇到同样的问题,如果我在 Page_Load 中而不是在回调中这样做,它工作正常。

我在另一个问题中阅读了很多关于此的内容,但没有一个答案能解决我的问题(大多数是针对 WinForms 等的)

我是这个领域的新手,我知道我可能遗漏了一些东西。请问你能帮帮我吗?如何实现我想要的正确方法?提前致谢!

【问题讨论】:

  • 正确的方法是SignalR
  • 我在项目的其他部分使用 SignalR 但没有考虑这个,我会尝试。
  • 我一直在尝试使用这个:var context = GlobalHost.Connectio‌​nManager.GetHubContex‌​t(‌​); context.Clients.All.‌​broadcastMessage("nam‌​e", "message");但它什么也没做。它仅在我在回调之外使用它时才有效,例如,当我按下按钮时。

标签: c# asp.net multithreading user-interface


【解决方案1】:

通过设置 myLabel.text = message,您可以更新 服务器 端的标签文本,同时您[还] 需要更新客户端浏览器中的文本。

这里的典型方法是:ajax pulling(您每 X 秒向服务器发送 ajax 请求以检查更新)或websockets(您的服务器可以将更新直接推送到客户端浏览器)。

【讨论】:

  • 但是当我直接在 Page_Load 中设置 text = "message" 时,它也适用于 UI,无需任何 ajax 拉取或 websockets 帮助。
  • 正确,因为 Page_Load 发生在实际 HTML 呈现之前,而您的后台工作人员可以在之后更新它。
猜你喜欢
  • 2010-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多