簡體   English   中英

C# Rx Observable.Never<> 表現得像 Observable.Empty<>?

[英]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 永遠不會發出(即EmptyNever ),則永遠不會調用該方法。 應用程序不會等待訂閱本身結束。 如果你想永遠等待,你會使用類似的東西

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.

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