[英]C# Rx Observable.Never<> behaves like Observable.Empty<>?
我是 Rx 的新手,並嘗試使用此代碼片段。
Observable.Never<string>().Subscribe(Console.Write);
Observable.Empty<string>().Subscribe(Console.Write);
我預計Never<string>()
行為會像Console.ReadKey
一樣不會結束,但是當我運行這兩行時,它們會立即結束,所以 [Never] 對我來說就像 [Empty] 一樣。
[Never] 的正確理解是什么,是否有很好的示例用法?
Observable.Never()
和Observable.Empty()
observable 都不會發出任何值。 但是,使用Observable.Never()
構建的 observable 不會完成,而是保持“打開/活動”狀態。 如果 observable 完成( Empty()
)或不完成( Never()
),在您使用這些 observable 的位置可能會有所不同,但這取決於您的實際用例。
擁有不發出任何值的 observable 聽起來可能毫無用處,但也許您正處於必須提供 observable 的位置(而不是使用null
)。 所以你可以這樣寫:
public override IObservable<string> NameChanged => Observable.Never<string>();
所以我對 Rx 沒有太多的經驗,但我相信Subscribe
所做的就是注冊當 observable 發出時要做什么。 如果您的 observable 永遠不會發出(即Empty
或Never
),則永遠不會調用該方法。 應用程序不會等待訂閱本身結束。 如果你想永遠等待,你會使用類似的東西
Observable.Never<string>().Wait();
這與您不應該在Subscribe
使用異步操作的原因有關。 取以下代碼
static void Main(string[] args)
{
Observable.Range(1, 5).Subscribe(async x => await DoTheThing(x));
Console.WriteLine("done");
}
static async Task DoTheThing(int x)
{
await Task.Delay(TimeSpan.FromSeconds(x));
Console.WriteLine(x);
}
運行時,應用程序將在將值推送到 observable 后立即寫入“完成”並退出,因為它不知道訂閱者是否已完成其處理。 希望我說清楚了,如果有更多 Rx 知識的人想在需要時介入以提供幫助,那就太好了。
此鏈接給你空的,從來沒有,也扔的區別: http://reactivex.io/documentation/operators/empty-never-throw.html這是從來沒有的一個用法: HTTPS://rxjs-dev.firebaseapp .com/api/index/const/從不
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.