0

我有这个功能,我试图将计时器事件作为单独的线程调用,但是当我单击页面中的任何按钮或在 asp.net 页面中执行任何操作时,计时器会停止一秒钟。

请帮助如何在页面中不受另一个控件影响的情况下并行运行它,因为计时器应该每秒钟运行一次,并且它不应该在 ui 中停止。

Thread obj = new Thread(new ThreadStart(timer));
obj.Start();
obj.IsBackground = true;

protected void timer()
{
    Timer1.Interval = 1000;
    Timer1.Tick += new EventHandler<EventArgs>(Timer1_Tick);
    Timer1.Enabled = true;
}

public void TimerProc(object state)
        {
            fromTime = DateTime.Parse(FromTimeTextBox1.Text);
            tillTime = DateTime.Parse(TillTimeTextBox1.Text);
            DateTime currDateTime = System.DateTime.Now;
            TimeSpan interval = tillTime - currDateTime;
            if (tillTime <= currDateTime)
            {
                ExamOverPanel1.Visible = true;
                QuestionPanel.Visible = false;
                ListBox2.Visible = false;
                StatusPanel1.Visible = false;
                VisitLaterLabel.Visible = false;
            }
            else
            {
                minLabel.Text = string.Format("{0:00}:{1:00}:{2:00}", (int)interval.TotalHours, interval.Minutes, interval.Seconds);
            }
        }
4

3 回答 3

1

您的 Timer1 对象是什么类?

是吗

System.Threading.Timer

或者

System.Timers.Timer

或者

System.Windows.Forms.Timer

或者

System.Web.UI.Timer

? 最后两个不是真正合适的计时器,而是到达您的消息队列....

所以我建议你检查你的命名空间引用 - 我在你的场景中的建议是使用 System.Threading.Timer 类。

于 2013-03-05T07:39:40.597 回答
0

我猜你正在使用System.Web.UI.Timer类,它用于UpdatePanel定期更新一个或整个页面。这个计时器不太准确,因为它完全在客户端浏览器上运行(使用 JavaScriptwindow.setTimeout函数)并向服务器发送 ajax 请求。如果您想在服务器上定期执行一些操作,您可以使用System.Threading.Timer在服务器上自己的线程中调用的对象:

public void InitTimer()
{
    System.Threading.Timer timer = new System.Threading.Timer(TimerProc);
    timer.Change(1000, 1000); // Start after 1 second, repeat every 1 seconds
}

public void TimerProc(object state)
{
    // perform the operation
}

但是如果你想在服务器上执行一些操作后更新页面,你仍然应该使用System.Web.UI.Timer. 您也可以将两者混合使用,使用线程计时器以高精度执行工作,并使用 Web 计时器更新页面。

System.Web.UI.Timer请参阅类的示例部分以获取示例用法。

于 2013-03-05T08:15:13.823 回答
0

我发现最好的方法是使用 Javascript 进行时间显示。并在后台运行不会更新 UI 的 C# 计时器。

<script type="text/javascript">

        var serverDateTime = new Date('<%= DateTime.Now.ToString() %>');
        // var dif = serverDateTime - new Date();

        function updateTime() {
            var label = document.getElementById("timelabel");
            if (label) {

                var time = (new Date());
                label.innerHTML = time;
            }
        }
        updateTime();
        window.setInterval(updateTime, 1000);
</script>

 <script type="text/javascript">
    window.onload = WindowLoad;
    function WindowLoad(event) {

        ActivateCountDown("CountDownPanel", <%=GetTotalSec() %>);
    }
//GetTotalSec() is c# function which return some value
    </script>

<span id="CountDownPanel"></span> //div to display time

无论用户界面如何,所有其他事情都将在 timer1_tick 函数上工作。

于 2013-03-07T09:23:06.677 回答