簡體   English   中英

Observable.Create不起作用,並且Observable.ToEnumerable無限期地阻塞

[英]Observable.Create doesn't work and Observable.ToEnumerable blocks indefinitely

為什么下面的代碼不起作用?

var observable = Observable.Create<int>(o => new Action(() =>
{
    o.OnNext(0);
    o.OnCompleted();
}));

foreach (var item in observable.ToEnumerable()) // <-- Here blocks
{
    // Never get here
}

以下都不起作用:

Task.Run(() =>
{
    foreach (var item in observable.ToEnumerable()) // <-- Still blocks
    {
        // Never get here
    }
}).Wait();

有趣的是,Generate方法按預期工作:

var observable = Observable.Generate(0, i => i < 1, i => i + 1, i => i);

foreach (var item in observable.ToEnumerable())
{
    // Is ok
}

這是不正確的:

var observable = Observable.Create<int>(o => new Action(() =>
{
    o.OnNext(0);
    o.OnCompleted();
}));

您打算提供一個在訂閱時調用OnNext的函數。 但是,您無意間調用了Observable.Create的錯誤重載,並為其提供了一個除了創建操作(將在處理訂閱時調用該操作)之外什么都不做的函數。 因此(錯誤地),您僅在OnNext訂閱后才嘗試調用OnNext

這就是您要執行的操作:

var observable = Observable.Create<int>(o =>
{
    o.OnNext(0);
    o.OnCompleted();

    return () => Console.WriteLine("Disposed!"); // this will be called when 
                                                  // subscription is disposed
});

或這個:

var observable = Observable.Create<int>(o =>
{
    o.OnNext(0);
    o.OnCompleted();

    return Disposable.Empty; // using System.Reactive.Disposables;
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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