[英]Observable.Create: CancellationToken doesn't transition to IsCancellationRequested
[英]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.