尝试更新标签中的文本并使用线程时,nullreferenceexception

时间:2012-08-20 19:34:27

标签: c# asp.net

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编程的半新手。

是否有更好的方式与代表合作呢?我花了几个小时来查看如何使用它们并没有那么多通常/易于理解的教程或博客

2 个答案:

答案 0 :(得分:1)

我不知道从哪里开始。

请记住,您正在编写网页,每次调用服务器都会导致服务器上的新网页生命周期。因此,在网页中使用线程不会导致正确的行为。

要获得所需的行为,您必须在客户端而不是服务器上执行计时器和单击处理。您可以使用jQuery来实现此目的。另一个选择是使用ajax,如果你必须使服务器保持最新。

答案 1 :(得分:0)

问题似乎在这里:

_Default temp = new _Default();

新类没有通过ASP.Net管道,因此当您尝试更新标记中的控件(时间)时,它实际上并未加载。

我认为你的方法有点缺陷。如果要在服务器端执行此操作,则需要使用重复的Ajax请求(或Web套接字)来使浏览器与服务器上的计时器对象保持同步。更不用说,当你有多个用户并且线程开始冲突时会发生什么?看起来使用Javascript会好得多。