public partial class _Default : System.Web.UI.Page
{
private static Stopwatch timer = new Stopwatch();
Thread timeThread = new Thread(timeKeeper);
private static int min = 0, sec = 0;
protected void Page_Load(object sender, EventArgs e)
{
}
protected void startstop_Click(object sender, EventArgs e)
{
timeThread.Start();
if(timer.IsRunning()) {timer.Stop}
else timer.Start();
}
private static void timeKeeper()
{
while (timer.IsRunning)
{
mydelegate();
}
}
private static void mydelegate()
{
_Default temp = new _Default();
temp.Update();
}
private void Update()
{
min = timer.Elapsed.Minutes;
sec = timer.Elapsed.Seconds;
time.Text = min + ":" + sec;
}
}
我想要做的是有一个控制秒表的按钮,当你点击它开始时,再次点击它停止。我认为最好的方法是使用一个线程,如果我想time.text显示继续更新,并能够仍然单击按钮。当我运行上面的程序时,它会到达time.text = min +“:”+ sec;并抛出nullreferenceexception。任何有关如何解决这个问题的帮助将不胜感激。我是C#/ asp.net编程的半新手。
是否有更好的方式与代表合作呢?我花了几个小时来查看如何使用它们并没有那么多通常/易于理解的教程或博客
答案 0 :(得分:1)
我不知道从哪里开始。
请记住,您正在编写网页,每次调用服务器都会导致服务器上的新网页生命周期。因此,在网页中使用线程不会导致正确的行为。
要获得所需的行为,您必须在客户端而不是服务器上执行计时器和单击处理。您可以使用jQuery来实现此目的。另一个选择是使用ajax,如果你必须使服务器保持最新。
答案 1 :(得分:0)
问题似乎在这里:
_Default temp = new _Default();
新类没有通过ASP.Net管道,因此当您尝试更新标记中的控件(时间)时,它实际上并未加载。
我认为你的方法有点缺陷。如果要在服务器端执行此操作,则需要使用重复的Ajax请求(或Web套接字)来使浏览器与服务器上的计时器对象保持同步。更不用说,当你有多个用户并且线程开始冲突时会发生什么?看起来使用Javascript会好得多。