用C#中的线程更新ASP.net UpdatePanel控件
本文关键字:ASP net UpdatePanel 控件 更新 线程 | 更新日期: 2023-09-27 18:00:29
我要做的事情:我试图使用网页后面代码中的线程(我使用的是ASP.NET web窗体网站项目)每隔0.5秒更新一个图像(在UpdatePanel控件中)
到目前为止我所拥有的:我在屏幕上有模拟图像。我还编写了一个线程,通过单击按钮调用它。这是代码:
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,因为我知道它们,但如果我需要使用它们,我需要使用
页面呈现后,如果不使用某种客户端技术(Javascript/jQuery等),就无法从仍在服务器上运行的代码中更改页面。
特别是在这种情况下,当你试图有效地实现一个看起来像图像滑块的东西时,你可以使用jQuery和许多滑块插件中的一个非常容易地实现它,这也会为你提供动画转换。
你不能按照自己想要的方式做你想做的事情。服务器端代码在服务器上运行,客户端代码在客户端上运行。只有当您可以让客户端重新加载您修改的页面或控件时,更新服务器上服务器控件的内容才会反映在客户端上。有很多方法可以重新加载页面/页面的部分,但在这种情况下,最好使用一些客户端JavaScript。
看起来图像是静态的,所以您可能可以使用一个简单的jquery图像滑块。有很多免费的,找到一个每5秒改变一次图像的,然后使用它,而不是因为你更喜欢用一种方式来制作Goldberg机器。
此功能是内置的。您所要做的就是在更新面板中添加一个异步触发器和计时器。
<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)
{
...
}
当用户在其他地方浏览页面时,upOnload()将每隔Timer.Interval毫秒执行一次。