【问题标题】:Update ASP.net UpdatePanel Control with a thread in C#使用 C# 中的线程更新 ASP.net UpdatePanel 控件
【发布时间】:2015-07-01 04:04:52
【问题描述】:

我正在尝试做什么:我正在尝试使用网页后面代码中的线程每 0.5 秒更新一次图像(在 UpdatePanel 控件中)(我是使用 ASP.NET Web 窗体站点项目)

我目前所拥有的:我在屏幕上显示的模拟图像就是这一刻。我还编写了一个通过单击按钮调用的线程。 这是代码:

protected void Button1_Click(object sender, EventArgs e)
{
    DoThing();

}
public void DoThing()
{
    Thread thread = new Thread(() => {
        while (true)
        {
            UpdatePanel1.Update();

            System.Threading.Thread.Sleep(500);

            if (Image2.ImageUrl == "~/Images/Water3.png")
            {
                Image2.ImageUrl = "~/Images/Water1.png";
                continue;
            }
            if (Image2.ImageUrl == "~/Images/Water1.png")
            {
                Image2.ImageUrl = "~/Images/Water2.png";
                continue;
            }
            if (Image2.ImageUrl == "~/Images/Water2.png")
            {
                Image2.ImageUrl = "~/Images/Water3.png";
                continue;
            }

        }
    });
    thread.Start();
    thread.Join();
}

这是我的 HTML:

<%@ Page Title="Home Page" Language="C#" Async="true"     MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<asp:Content runat="server" ID="FeaturedContent" ContentPlaceHolderID="FeaturedContent">
<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
    <ContentTemplate>
        <asp:Image ID="Image1" runat="server" Height="32px" Width="32px" ImageUrl="~/Images/Fauset.png"/><asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click"/><br />
        <asp:Image ID="Image2" runat="server" Height="96px" Width="32px" ImageUrl="~/Images/Water1.png" OnLoad="Image2_Load"/><br />
        <asp:Image ID="Image3" runat="server" Height="32px" Width="32px" ImageUrl="~/Images/Bucket.png"/>
    </ContentTemplate>
</asp:UpdatePanel>
</asp:Content>
<asp:Content runat="server" ID="BodyContent" ContentPlaceHolderID="MainContent">
</asp:Content>

问题:当我点击按钮时,页面当前什么都不做。当我在线程中放置一个断点时,线程正在运行。由于某种原因,该页面没有更新。

注意事项:我尽量远离 JS、Jquery 和 JSON,因为我大麦知道它们,但如果我需要使用它们,我需要使用它们

【问题讨论】:

    标签: c# asp.net multithreading


    【解决方案1】:

    页面渲染后,如果不使用某种客户端技术(Javascript/jQuery 等),您就无法从仍在服务器上运行的代码更改它。

    在这种情况下,特别是在您尝试有效地实现看起来像图像滑块的情况下,您可以使用jQuerymany slider plugins 之一非常轻松地完成它,这也将为您提供动画过渡。

    【讨论】:

      【解决方案2】:

      你不能按照你想做的方式做你想做的事。服务器端代码运行在服务器上,客户端代码运行在客户端。如果您可以使客户端重新加载页面或您已修改的控件,则在服务器上更新服务器控件的内容只会反映在客户端上。有很多方法可以重新加载页面/部分页面,但在这种情况下,您最好使用一些客户端 JavaScript。

      看起来图像是静态的,因此您可以使用简单的jquery image slider 来解决问题。有许多免费的可用,找到一个每 5 秒更改一次图像并使用它,而不是仅仅因为您更喜欢以一种方式来构建 Goldberg 机器。

      【讨论】:

        【解决方案3】:

        此功能是内置的。您所要做的就是在更新面板中添加一个异步触发器和计时器。

        <asp:UpdatePanel ID="UpdatePanel1" runat="server" OnLoad="upOnLoading" ChildrenAsTriggers="false" UpdateMode="Conditional">
        <ContentTemplate>
            <ControlToUpdate>
                ....
            </ControlToUpdate
            <asp:Timer ID="Timer1" runat="server" Interval="2000" />
        </ContentTemplate>
        <Triggers>
            <asp:AsyncPostBackTrigger ControlID="Timer1" />
        </Triggers>
        </asp:UpdatePanel>
        

        还有你的方法……

        protected void upOnLoading(object sender, EventArgs e)
        {
             ...
        }
        

        当您的用户在其他地方浏览您的页面时,upOnloading() 将每 Timer.Interval 毫秒执行一次。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-04
          • 1970-01-01
          • 2012-12-05
          相关资源
          最近更新 更多