我正在尝试做什么:我正在尝试使用网页背后代码中的一个线程每隔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,因为我知道它们但是如果我需要使用它们我需要使用它们
答案 0 :(得分:1)
页面呈现后,您无法在服务器上运行的代码中更改它,而无需使用某种客户端技术(Javascript / jQuery等)。
特别是在这种情况下,当您尝试实现有效的图像滑块时,您可以使用jQuery和其中一个many slider plugins轻松完成你动画过渡。
答案 1 :(得分:1)
你不能按照你想要的方式做你想做的事情。服务器端代码在服务器上运行,客户端代码在客户端上运行。如果您可以让客户端重新加载页面或您修改的控件,则更新服务器上服务器控件的内容将仅反映在客户端上。有很多方法可以重新加载页面/部分页面,但在这种情况下,最好使用一些客户端JavaScript。
看起来图像是静态的,所以你可以使用简单的jquery image slider来逃避。有许多免费的可用,找到一个将每5秒更改一次图像,并使用它而不是试图建立一个Goldberg机器只是因为你更喜欢以一种方式这样做。
答案 2 :(得分:0)
此功能是内置的。您只需在更新面板中添加异步触发器和计时器。
<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)
{
...
}
当您的用户在其他地方导航您的页面时,每隔Timer.Interval毫秒执行upOnloading()。