[英]Rx way to execute something in c sharp until a condition is true or timeout
我在數據庫表中有一個作業名稱列表,可以通過調用帶有作業名稱作為參數的 API 來啟動。 每項工作都需要 10 到 30 分鍾才能完成。 還有另一個 API 可以在某個時間間隔(10 分鍾)調用以檢查作業的完成狀態。 只有當列表中的前一個作業已完成/超時時才能啟動作業。 這些工作做什么在這里無關緊要。
我非常喜歡 Rx 框架,但對它知之甚少。
我目前正在從 db 中獲取所有作業名稱,然后在每個周期中循環遍歷它我正在調用 Job-trigger API 以啟動作業,然后在某個時間間隔內繼續調用 Job-status API,直到作業完成或之前超時下一個工作周期開始。
foreach(string jobName in lstJobs)
{
if(StartTheJob(jobName)) //if job successfully started
{
do{
Task.Delay(10000);
}
While(GetJobCompletionStatus(jobName));
// how to timeout this do/while loop
}
}
問題是,如果作業持續運行數小時,我找不到使 do while 循環超時並觸發下一個作業的方法。 有沒有更好的方法來使用 Rx 來做到這一點?
foreach(string jobName in lstJobs)
{
if(StartTheJob(jobName)) //if job successfully started
{
do{
Task.Delay(10000);
}
While(!ct.IsCancellationRequested);
}
}
您可以創建一個CancellationToken
使用CancellationTokenSource
:
var cts = new CancellationTokenSource(timeout);
var ct = cts.Token;
以下是使用 Rx 執行此操作的方法:
IObservable<string> query =
from jobName in lstJobs.ToObservable()
from started in Observable.Start(() => StartTheJob(jobName))
where started
from done in
Observable.Amb(
Observable.Timer(TimeSpan.FromMinutes(30.0)).Select(_ => true),
Observable
.Interval(TimeSpan.FromMinutes(10.0))
.SelectMany(_ => Observable.Start(() => GetJobCompletionStatus(jobName)))
.Where(s => s))
select jobName;
這里的邏輯是您要逐步完成每個作業並調用StartTheJob
。 如果它成功,那么您正在等待done
(即.Amb(...)
)30 分鍾.Timer(...)
或每 10 分鍾對GetJobCompletionStatus
的調用,直到返回true
。 最后它返回jobName
以便您可以看到成功的內容。 當 observable 完成時,您可以與原始列表進行比較,看看是否有任何不成功的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.