为什么以下琐碎的Rx.NET不打印任何数字?

时间:2016-07-13 04:28:37

标签: c# system.reactive reactive-programming

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个数字,实际上我没有。为什么呢?

1 个答案:

答案 0 :(得分:3)

您没有获得任何值,因为Observable.Range(0, 10).Subscribe(dst);在当前线程上运行完成,因此在调用await resdst没有任何值新的价值观。

您可以执行(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次然后附上一个事件处理程序。