为什么

Observable.Interval(TimeSpan.FromSeconds(1)).Window(2, 1).Concat()

放弃0,1,2,……?

我的预期是,.Window(2, 1)将产生一系列数字对(0, 11, 22, 3、...),因此.Concat()将一次产生两个数字,而不是一个.

我注意到

Observable.Interval(TimeSpan.FromSeconds(1)).Window(2, 1).Merge()

does按预期运行,然而在我的用例中,我有.Select().Window().Concat()之间执行工作,并且重要的是我保持了原始序列的顺序(在我的实际代码中实际上不是Observable.Interval),因此希望使用.Concat()来代替.

我的误解是什么导致了这种差异,我如何才能达到我想要的行为?

推荐答案

因为.Concat()只订阅当前完成后的下一个内部可观察对象,并且在订阅时,重叠的"下一个"可观察对象已经发出了它的第一个值,没有人消费.

使用.Merge()或 或.SelectMany(x => x)而不是合并 或使用.Buffer 或者创建如下所示的缓冲操作符:

public static class RxExtensions
{
    public static IObservable<T> CollectUntilSubscribed<T, TUntil>(this IObservable<T> source, IObservable<TUntil> stopMe)
        {
            var subscribersCount = 0;

            var ready = new Subject<Unit>();

            var delayed = source
                .Delay(x => subscribersCount > 0 ? Observable.Return(Unit.Default):ready)
                .Publish()
                ;

            var connection = delayed.Connect();

            stopMe.Take(1).Subscribe(_ => connection.Dispose());

            return Observable.Create<T>(o =>
            {
                var sub = delayed.Subscribe(o);

                if (Interlocked.Increment(ref subscribersCount) == 1) ready.OnNext(Unit.Default);

                return Disposable.Create(() =>
                {
                    Interlocked.Decrement(ref subscribersCount);
                    sub.Dispose();
                });
            });
        }
}

internal class Program
{
    static void Main(string[] args)
    {
        Observable
            .Interval(TimeSpan.FromSeconds(1))
            .Window(2,1)
            .Select(x => x.CollectUntilSubscribed(Observable.Never<Unit>()))
            .Concat()
            .Subscribe(Console.WriteLine);

            Console.ReadLine();
    }
}

Csharp相关问答推荐

Blazor:用参数创建根路径

C# uwp中的Win11启动屏幕剪辑工作方式不同

始终保留数组中的最后N个值,丢弃最老的

属性getter和setter之间的空性不匹配?

如何在Visual Studio代码中更改大括号模式{},用于C#语言

如何在WPF的树视图中显示一个对象的两个或多个属性,其中只有一个是分层项?

如何使用MailKit删除邮箱?

在.NET 7.0 API控制器项目中通过继承和显式调用基类使用依赖项注入

从另一个不同 struct 的数组创建Newtonsoft.Json.Linq.J数组

LINQ to Entities中的加权平均值

为什么Docker中没有转发该端口?

在PostgreSQL上使用ExecuteSqlRawAsync的C#11原始字符串文字有区分大小写的问题

Postgres ENUM类型在第一次运行时对Dapper不可见

Azure Functions v4中的Serilog控制台主题

为什么Azure函数(独立工作进程)索引失败?使用Azure App配置的CosmosDbTrigger绑定失败,未解析为值

MSI无法将快捷方式添加到启动文件夹

获取混淆&Quot;模糊引用&Quot;错误

此异步方法在重写方法中缺少等待运算符警告

未显示详细信息的弹出对话框

S,在.NET核心控制台应用程序中,AddScope和AddSingleton有什么不同?