0
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; 并抛出一个空引用异常。任何有关如何解决此问题的帮助将不胜感激。我对使用 C#/asp.net 进行编程是半新手。

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

4

2 回答 2

1

我不知道从哪里开始。

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

要获得您想要的那种行为,您必须在客户端而不是服务器上执行计时器并单击处理。您可以使用 jQuery 来促进这一点。如果您必须使服务器保持最新状态,另一种选择是使用 ajax。

于 2012-08-20T19:45:38.123 回答
0

看来问题出在这里:

_Default temp = new _Default();

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

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

于 2012-08-20T19:42:32.103 回答