using System;
using System.Reactive;
using System.Reactive.Linq;
using System.Reactive.Subjects;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
class Program
{
public static void Main()
{
Run().GetAwaiter().GetResult();
Console.WriteLine("Press any key ...");
Console.ReadKey();
}
private static async Task Run()
{
await Task.Delay(1);
var dst = new Subject<int>();
var res = dst
.SelectMany(async arg =>
{
await Task.Delay(1);
Console.WriteLine(arg);
return Unit.Default;
})
.DefaultIfEmpty();
Observable.Range(0, 10).Subscribe(dst);
await res;
}
}
}
我希望输出上有10个数字,实际上我没有。为什么呢?
答案 0 :(得分:3)
您没有获得任何值,因为Observable.Range(0, 10).Subscribe(dst);
在当前线程上运行完成,因此在调用await res
时dst
没有任何值新的价值观。
您可以执行(1)var dst = new ReplaySubject<int>();
或(2)Observable.Range(0, 10).Delay(TimeSpan.FromSeconds(1.0)).Subscribe(dst);
来获取代码中的值。
无论哪种方式,这都不是普通的Rx。
我认为Lee的评论写得特别好,所以我认为值得在这里添加:
即。
Observable.Range(0, 10).Subscribe(dst);
立即将10个值输入主题。然后在res
上调用订阅。价值观消失了。Subject<T>
不会缓存值。这就像举起一个事件10次然后附上一个事件处理程序。