0

タイマーイベントを別のスレッドとして呼び出そうとしているこの関数がありますが、ページのいずれかのボタンをクリックするか、asp.netページで何かを実行すると、タイマーが1秒間停止します。

タイマーは毎秒実行されるべきであり、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

?最後の2つは実際には適切なタイマーではありませんが、メッセージキューに到着します。

したがって、名前空間の参照を確認することをお勧めします-シナリオでの私の推奨事項は、System.Threading.Timerクラスを使用することです。

于 2013-03-05T07:39:40.597 に答える
0

ページ全体またはページ全体を定期的System.Web.UI.Timerに更新するために使用されるクラスを使用していると思います。このタイマーは、(JavaScript関数UpdatePanelを使用して)クライアントブラウザーで完全に実行され、サーバーにajaxリクエストを送信するため、それほど正確ではありません。window.setTimeoutサーバー上で定期的に何らかの操作を実行する場合は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タイマーを使用してページを更新することで、この2つを混在させることもできます。

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

他のすべてのものは、UIに関係なくtimer1_tick関数で機能します。

于 2013-03-07T09:23:06.677 に答える