为什么下面的代码不起作用?
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
}
答案 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;
});