簡體   English   中英

無法獲取Timer來調用C#中的方法

[英]Cant get Timer to call a method in C#

我試圖使用線程計時器每三秒鍾一次地調用一個方法。 這是我目前正在使用的代碼

public void Main()
    {
        TextBoxMessage.Text = "Started! " + DateTime.Now.ToString();
        Timer aTimer = new Timer(new TimerCallback (SendMessage), null, 3000, 3000);

    }

    public void SendMessage(Object sender)
    {
        TextBoxMessage.Text = "Timer Tick! " + DateTime.Now.ToString();
    }

截至目前,我得到了“入門!” 消息,但我從未看到“計時器滴答!” 信息。 這顯然是非常基本的代碼,我只是想弄清楚如何使用此計時器,但進行了搜索和搜索,無法弄清楚我在做什么錯。

先謝謝您的幫助!

您對ASP.Net Webforms的工作原理有基本的誤解。

您的Web表單頁面仍然完全是為了處理HTTP請求以產生HTTP響應。 每當有人查看您的頁面時,HTTP請求都會發送到您的Web服務器。 然后,服務器會創建您的Page類的新實例,以便將該請求處理為HTTP響應。 Page類通過ASP.Net Page生命周期工作 ,將HTTP響應發送到Web瀏覽器,然后ASP.Net 銷毀Page類的實例以釋放資源用於下一個HTTP請求。 與您的Page的進一步交互, 甚至由同一用戶發回同一頁面 ,都由該類的全新實例處理。

現在讓我們將此知識應用於您的問題。 您希望在Web服務器上運行一個在Page類中設置屬性的計時器。 現在應該很清楚,在您希望觸發計時器的已運行代碼時,正在使用的Page對象不再存在 充其量,這是由於嘗試使用不存在的對象而導致服務器上的空引用異常。 也許計時器可能會阻止ASP.Net回收舊的頁面類(最終,當服務器用盡資源時,它會使服務器崩潰)。 另一個選擇是運行計時器可以防止頁面生命周期結束,因此不會向用戶發送任何響應,並且頁面或瀏覽器將超時。 但是實際發生的是,ASP.Net在回收頁面時會破壞您的計時器,因此它永遠不會計時。

您需要做的是用javascript編寫此代碼以在客戶端上運行。

如果您真的希望它在服務器上運行,則有可用的選項,但是它們都非常復雜。 SignalR是一個相對簡單並且在ASP.Net世界中具有一定吸引力的選項

您只需初始化Timer對象。 下一步是調用方法Start()以啟動線程。

aTimer.Start()

希望這個幫助:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM