簡體   English   中英

Rx 在 c 中執行某些內容的方式,直到條件為真或超時

[英]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 來做到這一點?

使用CancellationToken

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.

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