我有關于一種(或兩種)反應式方法的新問題。在我的場景中,我需要一個能夠在第一個任務未完成時抑制其他發出的任務的可觀察序列,并最終得到如下內容:
Observable.Interval(TimeSpan.FromMilliseconds(200))
.Select(x => Observable.FromAsync(async () =>
{
await Task.Delay(1000);
// Simulating long running task
Console.WriteLine(x);
}))
.Publish(x => x.FirstAsync().SelectMany(c => c).Repeat())
.Subscribe();
我試圖谷歌,但我真的無法解釋一些事情:
- 首先,它是如何作業的???
- 阻止可觀察物件到達訂閱的反應序列到底是什么?究竟是什么
Replay?在這種情況下不Replay應該重播任務嗎?或者我不知道。任何人都可以詳細解釋該反應式查詢中的每一步嗎?Publish這種選擇器有什么作用。Replay在那個查詢中玩得怎么樣?如果無論如何只會發出一個元素,為什么我需要呼叫SelectMany。FirstAsync
uj5u.com熱心網友回復:
這
.SelectMany(c => c)是扁平化/合并嵌套序列的慣用方式。您可以將其替換為.Merge(),查詢的行為將是相同的。Publish運算子與引數一起使用時,Func<IObservable<TSource>, IObservable<TResult>>訂閱它所鏈接的查詢,然后保持訂閱狀態,直到 lambda 生成的序列完成。因此,在您的情況下,通過將內部序列包裝x.FirstAsync().SelectMany(c => c).Replay()在 a 中Publish,您可以延遲鏈式序列(IntervalSelectFromAsync)的取消訂閱,直到內部序列完成。內部序列永遠不會完成,因此鏈式序列永遠保持IObservable<Unit>每秒產生一個冷子序列。Do您可以通過在 之前攔截一個運算子來觀察這種情況Publish:
.Do(x => Console.WriteLine($"New subsequence: {x.GetType().Name}"))
Replay運算子類似于Publish,不同之處在于具有Replay過去通知的記憶,而Publish沒有任何記憶。我猜你的意圖是附加Repeat而不是Replay. without 引數會產生一個“可連接”的Replayobservable,它不會自動訂閱鏈式序列。您必須Connect手動操作,或者將RefCount操作員附加到它。在您的情況下,您什么都不做,因此生成的序列永遠不會發出任何東西,也永遠不會完成。這是一個令人討厭的僵局。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/437404.html
標籤:C# 。网 异步 system.reactive
