定時任務的處理

2022-02-10 11:18:30 字數 1250 閱讀 9220

對於定時任務,一般由時間戳timers 或者死迴圈while(true) 操作,兩者都能達到,指定間隔時間內執行去執行任務,這裡不做效率的比較,只說明一下適合的場景。先拿while來說,執行完成任務後,設定好執行緒等待時間即可,它有一優勢,即如果此次任務未執行完,則不會進入下一次,也就是說是可控的,不會同時執行兩筆相同任務

public

void

startloadtask()

}

再來看一看times ,這裡僅作 system.timers 下的timer的說明(非 threading 中的timer),如下圖

//

執行定時服務

var timer = new timer() ;

timer.elapsed += (sender, eventargs) => helper.starttask();

可以滿足每隔60s 呼叫一次 starttask 方法,但是會有乙個問題,試想如果由於某個內部或外部原因,導致執行一次程式的時間超過了60s,如果直接這樣寫,則會出現第乙個任務還未執行完,下乙個任務又進來,則同時執行兩筆任務的情況,顯然是不可取的,需要進行改進,即需等上次任務執行完,再去等待間隔,然後進入下一次任務,否則永遠要等上一筆任務執行完。這裡將 timer 當做引數 傳遞給 starttask 方法,則

public

void

starttask(timer timer)

看似兩種操作都達到了需求,細想下來,還有不妥。試想任務是每分鐘執行一次的,雖然這樣處理解決了不會同時執行多筆任務的問題,可若任務執行時間超過了60s,則錯過了下一次任務的執行時間。這樣的話豈不是顧此失彼,既要每次只執行一筆任務,又不能錯過每一次任務。想要滿足這種要求,則只能引用安全佇列機制,每隔60s,便把任務寫入佇列中,再啟乙個執行緒去迴圈讀取佇列裡的任務便可。這樣乙個執行緒儘管往裡面寫,另外乙個執行緒負責取,每執行完一筆任務,就去讀下一筆任務,如此往復。

寫入佇列如下

public

void

starttask()

取出佇列如下

public

void

starttask()

thread.sleep(

60000

); }

}

當然取出佇列任務 需要設定執行緒為 非同步  task.factory.startnew(starttask);

Oracle定時任務處理

一.檢視oracle資料庫中的job select job,what from user jobs 二.刪除oracle中的job execute dbms job.remove jobid 三.如何設定oracle任務 任務號 43 定時任務 declare job backup number b...

linux定時任務 at定時任務

at命令是一次性定時計畫任務,at的守護程序atd會以後臺模式執行,檢查作業佇列來執行作業。atd守護程序會檢查系統上的乙個特殊目錄來獲取at命令的提交的作業,預設情況下,atd守護程序每60秒檢查一次目錄,有作業時,會檢查作業執行時間,如果時間與當前時間匹配,則執行此作業。注意 at命令是一次性定...

at定時任務

at的守護程序每60秒檢查一次作業佇列,有作業時檢查作業,時間恰好達到,則執行作業。前提 保證atd程序已經啟動,檢查atd程序是否啟動 ps ef grep atd。atd的命令格式 at 選項 時間 ctrl d 結束at命令的輸入。選項 m 任務完成後給使用者傳送郵件,沒有標準輸出。i atg...