我正在尝试设计一个简单的计数器,它只显示Label控件中的秒数。也就是说,只需从0到59重复DateTime.Now.Seconds,然后重复直到应用程序关闭。
我已经阅读了其他一些解决方案,并且能够使用AJAX使其工作,但我的问题是为什么我的以下代码不起作用?
代码将显示标签中的当前秒,但仅显示一次。每个" Tick"都不会重复。我已尝试在各个地方进行while(true)循环,但代码永远不会完成(只是进入无限循环)。
我知道有使用JavaScript(和其他)的解决方案,但我希望看到此代码可行,如果可能的话,没有任何外部脚本。 感谢。
using System.Timers;
namespace WebApplication2
{
public partial class _default : System.Web.UI.Page
{
private static System.Timers.Timer aTimer;
protected void Page_Load(object sender, EventArgs e)
{
// set the Timer to pass event "Elapsed" every 1 second
aTimer = new System.Timers.Timer(1000);
// wire the Event to the EventHandler
aTimer.Elapsed += OnTimedEvent;
// set the Timer to repeat automatically
aTimer.Enabled = true;
// display the output of the doCount method in the text box
timeLabel.Text = doCount().ToString();
}
// when the Event fires, call the doCount method
private static void OnTimedEvent(Object source, ElapsedEventArgs e)
{
doCount();
}
// Each time the doCount method is called, read the current time and output the "Second"
// back to the timeLabel.Text call.
public static int doCount()
{
int beat = DateTime.Now.Second;
return beat;
}
}
}
答案 0 :(得分:1)
您可以使用AJAX,因为AJAX能够在初始响应发送到客户端后与服务器通信。常规Web窗体周期如下所示:
浏览器向服务器发送请求
服务器收到请求
服务器处理请求并生成响应
服务器向客户端发送响应。
在步骤#4之后,除非客户端专门发出新请求(基本上是AJAX的定义),否则不能再从服务器向客户端发送内容。
有很多方法可以解决这个问题。一个是AJAX。其他的是永久帧,服务器发送事件和Web套接字(可能还有一些其他模糊不清的东西)。有了这些,您可以将其视为客户端启动与服务器的连接然后保持打开状态,以便服务器可以连续向客户端发送数据。
这样做的一个后果是它会迫使您思考服务器真正需要做什么。客户端可以完成很多,绝对可以处理简单的计时器并更新标签中的文本而不涉及服务器。当您编写Web应用程序时,您应该尽可能多地在客户端上执行此操作。您只有一台具有有限资源的Web服务器,但如果您充分利用连接到站点的每个客户端的资源,则可以更好地扩展。服务器为客户端生成初始HTML,并且需要数据库访问和访问各种其他API。但如果您可以在不使用服务器的情况下在客户端上执行操作(UI操作),那就去吧!
答案 1 :(得分:0)
这将永远不会有效,因为只要请求得到处理,服务器就会创建一个新的页面实例,处理它并立即发送给客户端。一旦发送输出就无法操作输出,这就是为什么你必须使用javascript来完成这样的任务。
您应该了解有关Web开发的更多信息,因为与开发桌面应用程序相比,它确实有所不同。因此,学习MVC而不是Webforms可能是一个更好的主意,因此您可以更清楚地了解正在发生的事情。在Webforms中,这可能会使像你这样的人感到困惑,因为它看起来几乎和你开发Windows应用程序一样,但这只是一种错觉。
答案 2 :(得分:0)
您的代码误解了ASP.NET网页的工作原理。你应该读这个:https://msdn.microsoft.com/en-us/library/ms178472%28v=vs.85%29.aspx
有效地,服务器呈现页面并将其提供给客户端(浏览器)。之后它只响应从客户端发起的事件。