c Timer中的乙個問題

2021-08-07 01:22:28 字數 1866 閱讀 8266

我們知道,system.threading.timer可以定時每隔一段時間執行一次任務。

不知道大家有沒有想過,如果任務執行時間比較長,interval到期之後會發生什麼;是會結束當前的執行緒,還是會重新啟動乙個執行緒?

下面**我們模擬一下,任務執行時間5s, interval=2s的運**況:

從截屏裡我們看到,2s 時間間隔到期之後,系統除了原始執行緒之外,會新建立其它執行緒(原始執行緒:11;新執行緒:12,13)。這是我們期望的嗎?恐怕大部分情況下不是。

我們期望的是:即使2s的時間間隔到期,系統需要等待當前任務執行完畢之後,再重新啟動乙個新的執行週期,期間不必建立新的執行緒。

我們做的第乙個嘗試是:為timer物件設定autoreset=false,之後在elapsed方法的最後,重新啟動timer,進入新的執行週期。

autoreset屬性的說明如下:timer should raise the system.timers.timer.elapsed event only once (false) or repeatedly (true)。預設情況下這個值是true,也就是會不間斷的觸發elapsed方法;false的意思是只觸發一次elapsed方法。

完整**如下:

從截屏裡我們看到,2s 時間間隔到期之後,系統沒有建立新的執行緒;待當前執行緒執行完畢之後;又重新開始了新的執行週期,與我們期望的相符。

但是,這就結束了麼? no,這太麻煩了,為此我們建立了乙個類:

using system.timers;

namespace timertest2

public cetimer(double interval)

public void initializetimer()

public void initializetimer(double interval)

public void close()

public void start()

public void stop()

private void internalelapsed(object sender, elapsedeventargs e)}}

用起來很方便,不用考慮設定autoreset,不用重新啟動執行週期。你只需要考慮時間間隔,和你需要執行的方法。

呼叫示例如下:

using system;

using system.timers;

namespace timertest2

static void ct_elapsed(object sender, elapsedeventargs e)}}

}

以上。

TOMCAT中的乙個問題

這兩天在客戶端部署bo報表系統遇到乙個奇怪問題,tomcat啟動面板打出來的日誌資訊埠號為8181,但我在server.xml檔案裡面已經將埠號改為了8107,但為什麼會是8181呢!真是一頭霧水。用ue在tomcat目錄下所有檔案裡面都搜了一遍字元為 8181 的檔案,但乙個也找不到。這個8181...

qt中的乙個問題

1 這是我在看qt的乙個pdf的時候遇到的問題。如下 mydlg my1 if my1.exec qdialog accepted 其中在my1上有乙個button,w為乙個widget,button的clicked訊號,對應了my1的recept 槽。剛學qt死活看不懂這句話 現在好像大概明白了點...

開發中的乙個問題

在使用者進來之後,當使用者進行第一次請求的時候 可能是由於伺服器配置問題,tomact和nginx兩次 後出現這個問題,會莫名其妙先請求http的乙個請求然後重定向報錯。我反應了很久,幾個架構也找不到解決方案。但這個問題是很有規律性的。1.出現在第一次請求介面的時候,第二次就是一定是好的。2 出現在...