Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 被Rx Observable SelectMany卡住了_C#_.net_System.reactive - Fatal编程技术网

C# 被Rx Observable SelectMany卡住了

C# 被Rx Observable SelectMany卡住了,c#,.net,system.reactive,C#,.net,System.reactive,我的目标是通过ftp下载文件,并以某种方式异步处理它们。 我将文件列表转换为IObservable,并使用SelectMany combinator进行处理。在内部,有一些操作可以下载被阻止的文件:尝试下载具有重试次数的文件并返回元组,或者在失败的情况下返回元组并将其包装为可观察的。“延迟后可观察到的可重试”的样本,我已经采取并稍微修改了它。 问题是,我的代码在下载了几个文件后会随机停止。有时,它在“Subscribe”方法中到达“OnNext”回调。我从未检测到代码到达“OnComplete”

我的目标是通过ftp下载文件,并以某种方式异步处理它们。 我将文件列表转换为IObservable,并使用SelectMany combinator进行处理。在内部,有一些操作可以下载被阻止的文件:尝试下载具有重试次数的文件并返回元组,或者在失败的情况下返回元组并将其包装为可观察的。“延迟后可观察到的可重试”的样本,我已经采取并稍微修改了它。 问题是,我的代码在下载了几个文件后会随机停止。有时,它在“Subscribe”方法中到达“OnNext”回调。我从未检测到代码到达“OnComplete”回调。也没有抛出异常

        files.ToObservable().SelectMany(f =>
        {
            var source = Observable.Defer(() => Observable.Start(() =>
            {
                ftpConnection.DownloadFile(avroPath, f.Name);
                return Tuple.Create(true, f.Name);
            }));
            int attempt = 0;
            return Observable.Defer(() => ((++attempt == 1)
                ? source
                : source.DelaySubscription(TimeSpan.FromSeconds(1))))
                .Retry(4)
                .Catch(Observable.Return(Tuple.Create(false, f.Name)));
        }).Subscribe(
            res =>
            {
                Console.Write("Damn, its only rarely gets there, however some files were downloaded succesfully");
                if (res.Item1) Process(res.Item2);
                else LogOrQueueOrWhatever(res.Item2);
            },
            (Exception ex) =>
            {
                Console.Write("Never was thrown");
            },
            () =>
            {
                Console.Write("Never entered this section");
                ProcessLogs();
                ScheduleNExtDownloadRoutine();
            });

如果有人能展示出更惯用的方法来处理可观察对象上的组合符,我将不胜感激。

正如布兰登所提到的,在定义可观察对象的行为之后,没有同步/阻塞。因此,我用“ForEachAsync”替换“Subscribe”调用,将可观察的转换为Task,并用Tasks的“Wait”方法阻止调用方:


您的应用程序是否在您给它足够的时间异步下载所有文件之前退出(
Subscribe
不阻止当前线程)?正是这种情况。在消息发布后才意识到,所以新手请告诉我。仅供参考,我可以为重试操作员查看以下问题:
    files.ToObservable().SelectMany(f =>
    {
        var source = Observable.Defer(() => Observable.Start(() =>
        {
            ftpConnection.DownloadFile(avroPath, f.Name);
            return Tuple.Create(true, f.Name);
        }));
        int attempt = 0;
        return Observable.Defer(() => ((++attempt == 1)
            ? source
            : source.DelaySubscription(TimeSpan.FromSeconds(1))))
            .Retry(4)
            .Catch(Observable.Return(Tuple.Create(false, f.Name)));
    }).ForEachAsync(res =>
    {
        if (res.Item1) Process(res.Item2);
        else LogOrQueueOrWhatever(res.Item2);
    }).Wait();

    ProcessLogs();
    ScheduleNExtDownloadRoutine();