我不確定兩種可能性來對我的代碼中的事件做出反應。我主要關心哪一個人需要更少的資源。 我有一個觀察者註冊到eventproducer
的方法。如果eventproducer
返回某些內容,則此方法退出並且方法的調用者再次啓動該方法(您可以將其視爲一種長輪詢)。取消task.delay無例外或使用異常來控制流量?
eventproducer
有時會每秒發生大量事件,有時會休息幾分鐘。
第一種方法是等待500毫秒的延遲,然後檢查是否有東西要返回或以其他方式(直到超時5分鐘)再次延遲500毫秒。
eventProducer.RegisterListener((events)=>{evList.Add(events)});
while(evList.Count=0 && !TimeOut){
await Task.Delay(500);}
eventProducer.UnRegister(...);
// return evList, method gets recalled immediately
第二種方法是使用CancellationToken
。如果eventproducer
產生某些東西,則CancellationTokenSource
將取消源。在該方法中,我等待Task.Delay(5min, cancellationToken)
。
eventProducer.RegisterListener((events)=>{evList.Add(events);
cancelSource.Cancel();}
try
{
await Task.Delay(5min, cancellationToken)
}
catch(TaskCanceledException){//nothing to do};
eventProducer.UnRegister(...);
// return evList, method gets recalled immediately
第二種方法的優點是,如果廠家生產的東西,我們不必等待,並在循環清醒的方法立即返回。
但隨着第二種方法每次生產者產生東西時,引發TaskCanceledException
。我擔心這可能會影響系統負載超過清醒並等待每500ms,特別是當eventproducer
產生大量事件時。
我是否高估了投擲和捕捉異常的成本?有沒有辦法取消Task.Delay
與CancellationToken
但沒有投擲TaskCanceledException
? I.E.像task.setComplete
?
爲什麼五分鐘? – i3arnon
它只是一個「更長時間」的佔位符 – xartal