2013-03-05 51 views
0

我有这个函数,我试图调用定时器事件作为单独的线程,但是当我点击页面中的任何按钮或做任何事情在ASP .net页面,然后定时器停止一秒。并行处理定时器的事件与主线程在asp.net c#

请帮助如何在没有页面中另一个控件的效果的情况下运行paralley,因为计时器应该每秒运行一次,并且不应该停在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); 
      } 
     } 

回答

0

我发现的最佳方式是使用Javascript进行时间显示。并在不会更新用户界面的背景下运行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函数上工作,与UI无关。

1

你的Timer1对象是什么类?

System.Threading.Timer 

System.Timers.Timer 

System.Windows.Forms.Timer 

System.Web.UI.Timer 

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

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

0

我猜你正在使用System.Web.UI.Timer类,它用于定期更新UpdatePanel或整个页面。此计时器并不准确,因为它完全在客户端浏览器上运行(使用JavaScript window.setTimeout函数),并向服务器发送一个jax请求。如果你要定期做服务器上的一些操作,您可以使用它在自己的线程中调用服务器上的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 class的示例部分以获取示例用法。

+0

我实现了,但计时器没有运行每秒。如何改变每秒的时间? – 2013-03-05 09:24:32

+0

@Nishantverma“TimerProc”方法每秒运行一次。不需要其他操作。你在'TimerProc'中放了什么? – 2013-03-05 09:32:29

+0

我没有调试,发现它的运行速度每秒但没有更新UI.plz检查 – 2013-03-05 09:34:23