1

可能重复:
有谁知道如何解决这个问题?每当我返回网页时,我的计时器都不会重置为 30 分钟

这是我的代码,希望有人能帮助我,谢谢

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        Timer1.Enabled = true;
        if (Session["CountdownTimer"] == null )
        {
            Session["CountdownTimer"] = new CountDownTimer(TimeSpan.Parse("00:30:00"));
            (Session["CountdownTimer"] as CountDownTimer).Start();
        }
    }
}

protected void Timer1_Tick(object sender, EventArgs e)
{
    if (Session["CountdownTimer"] != null)
    {
        if (Label1.Text != "00:00:00")
        {
            Label1.Text = (Session["CountdownTimer"] as CountDownTimer).TimeLeft.ToString();
            Session["time"] = Label1.Text;
        }
        else if((Session["CountdownTimer"] as CountDownTimer).TimeLeft.Seconds <= 0)
        {
            (Session["CountdownTimer"] as CountDownTimer).Stop();
            Timer1.Enabled = false;
            Response.Redirect("timer.aspx");
        }
    }
}

public class CountDownTimer
{
    public TimeSpan TimeLeft;
    System.Threading.Thread thread;
    public CountDownTimer(TimeSpan original)
    {
        this.TimeLeft = original;
    }
    public void Start()
    {
        // Start a background thread to count down time
        thread = new System.Threading.Thread(() =>
        {
            while (true)
            {
                System.Threading.Thread.Sleep(1000);
                TimeLeft = TimeLeft.Subtract(TimeSpan.Parse("00:00:01"));

            }
        });
        thread.Start();
    }

    public void Stop()
    {
        // Start a background thread to count down time
        thread = new System.Threading.Thread(() =>
        {
            while (true)
            {
                System.Threading.Thread.Sleep(1000);
                TimeLeft = (TimeSpan.Parse("00:00:00"));

            }
        });
        thread.Abort();
    }
}
4

2 回答 2

3

我想我不确定您要达到的目标。但是,一些观察结果可能会帮助您获得所需的东西?

  • Timer1_Tick永远不会被调用。
  • CountDownTimer.Start有一个while(true)永远不会退出的循环。
  • CountDownTimer.Start睡后不做任何有趣的事
  • CountDownTimer.Stop还有一个永远不会退出的 while(true)` 循环。
  • 做什么Timer1.Enable
  • 你想在这里做什么?这完全不清楚。
于 2012-10-05T17:44:10.873 回答
1

不是真的回答...但不适合评论...

在大多数情况下,要实现任何类型的计时器,可以依靠现有时间(DateTime.Now)并知道计时器何时开始/停止。

重新考虑您的设计可能是个好主意。以下事情会导致奇怪/意外的行为:

  • 将不可序列化的对象置于会话状态,
  • 依赖内存中的会话状态是持久的(即在应用程序重建、服务器重新启动后幸存下来)
  • 在 ASP.Net 应用程序中使用线程
  • 使用 Thread.Abort
  • 使用 Thread.Sleep
于 2012-10-05T18:48:31.797 回答