【问题标题】:onCompleted and onNext not reachedonCompleted 和 onNext 未达到
【发布时间】:2017-01-11 23:38:31
【问题描述】:

我创建此方法是为了从事件中创建Observable。我正在尝试下载文件并更新进度条:

private void BuildObservables(WebClient webClient)
{
    Observable.FromEventPattern<AsyncCompletedEventHandler, AsyncCompletedEventArgs>(h => webClient.DownloadFileCompleted += h, h => webClient.DownloadFileCompleted -= h)
        .Select(ep => ep.EventArgs)
        .Subscribe(
            _ =>
            {
                //stuff code
            },
            _ => this.WizardViewModel.PageCompleted()   <<<<< (*) NOT REACHED
        );

    Observable.FromEventPattern<DownloadProgressChangedEventHandler, DownloadProgressChangedEventArgs>(h => webClient.DownloadProgressChanged += h, h => webClient.DownloadProgressChanged -= h)
        .Select(ep => ep.EventArgs)
        .Subscribe(
            a =>
            {
                <<<<< (*) NOT REACHED
                this.progressEdit.Position = a.ProgressPercentage;
                progressEdit.Update();
            }
        );
}

我正面临着(*) 在源上标记的点(onCompletedonNext)没有到达。

有什么想法吗?

【问题讨论】:

    标签: .net system.reactive


    【解决方案1】:
    • 您的OnCompleted 处理程序实际上是一个OnError 处理程序。 OnCompleted lambdas 不带参数,使用 () =&gt; ... 而不是 _ =&gt; ... 来达到正确的重载 - 但这无论如何都无济于事,因为:

    • 即使纠正后,OnCompleted 也不会触发。 FromEventHandler 不会将 .NET 事件映射到 OnCompleted - 没有有意义的转换。要全面了解为什么会这样,请参阅我在 How to use Observable.FromEvent instead of FromEventPattern and avoid string literal event names 中的回答。在你的情况下,OnNext 处理程序就是你想要的。

    • OnNext 事件肯定会在我下载“www.google.com”的简单测试应用程序中触发,您是否允许在应用程序终止之前触发事件?您是否在调用 DownloadXXXAsync 之前调用 BuildObservables - 如果不这样做,您可能会错过这些事件?如果这没有帮助,您能否提供一个最低限度的完整工作重现来演示该问题?

    【讨论】:

    • A .Take(1) 应该会导致 OnCompleted 触发。
    • 确实如此。它不会改变底层 .NET 事件没有“完成”的等效表示这一事实,但当您知道您正在寻找一个事件时,它肯定对于清理可观察链中的资源很有用。
    猜你喜欢
    • 2016-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多