Observable.Create无效,Observable.ToEnumerable无限期阻塞

时间:2013-08-13 12:08:09

标签: c# linq ienumerable .net-4.5 system.reactive

为什么下面的代码不起作用?

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
}

1 个答案:

答案 0 :(得分:3)

这是不正确的:

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

您打算提供一个在订阅时调用OnNext的函数。但是,你无意中调用了Observable.Create的错误重载,并为它提供了一个除了创建动作之外什么都不做的功能(将在处理时调用订阅)。所以(错误地),您只是在处理订阅时尝试调用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;
});