簡體   English   中英

C# 定時器間歇性停止

[英]C# Timers stopping intermittently

任何人都可以提出為什么 C# 計時器(在代碼隱藏類中創建)會在沒有被告知的情況下停止的任何原因嗎?

我的計時器在頁面加載時開始,然后在我單擊按鈕時停止。 我不需要單擊按鈕,它有時會停止。 據我所知,IIS 沒有重新啟動,也沒有拋出任何錯誤。

這讓我有點困惑......

謝謝。

    // This gets called on page_load
    private void checkTimer()
    {
        if (!parentTimer.Enabled) // If parent timer is not enabled then it is probably the start of a new day (after a night time server backup which kills timers)
        {
            parentTimer.Interval = 60000; // One minute
            parentTimer.Elapsed += new ElapsedEventHandler(parentTimer_Elapsed); // Define what happens when elapsed
            parentTimer.AutoReset = true; // Set timer to repeat
            parentTimer.Enabled = true; // Start the timer
        }
    }

    protected void btnCancel_Click(object sender, System.EventArgs e)
    {
        parentTimer.Stop();
        ...etc...
    }

注意:我在其 elapsed 方法中根本沒有更改 ParentTimer。

基本上 ParentTimer 管理 ChildTimer 的列表。 如果 ParentTimer 過去了,它會檢查一個或多個 ChildTimer 是否也已經過去,如果是,則有一個事件,如果沒有,則重置 ChildTimer 並繼續。

我懷疑這是因為頁面的工作進程在請求結束時停止。

您可以嘗試增加請求超時,但更好的問題是您能解釋一下為什么要這樣做嗎? 您要解決的問題是什么?

請記住,盡管 ASP.Net 在您的代碼周圍放置了所有讓您感覺舒適的絨毛(會話 state、視圖狀態等),但 web 請求是無狀態的,應該被視為獨特的邏輯傳遞,它不像 state、視圖狀態等void Main(...) function 中的后台代碼線程不斷運行的應用程序。

計時器與創建它的線程相關聯,在 ASP.net 的情況下,處理給定用戶發出的每個頁面請求的線程將由於使用工作線程和線程池而頻繁更改。

在頁面級別使用計時器根本行不通。 您需要在會話級別(與特定用戶相關)跟蹤 state 作為起點。

事實上,我根本不會在 web 應用程序中使用定時器,因為它們的執行根本無法保證。

如果您使用它來運行后台任務 - 考慮在Application_Start或類似的東西中啟動您自己的工作線程。 當應用程序池回收時線程將被終止。 您還應該查看手動關閉線程,應用程序也被關閉。

但是,請注意這一點,該線程不能假設它始終是唯一運行的線程 - 由於 IIS 重疊回收,當一個新的啟動時舊的仍然可能在舊的 AppDomain 中運行。

暫無
暫無

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

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