【问题标题】:Why is Finally not called on my DownloadStringAsync Observable?为什么在我的 DownloadStringAsync Observable 上没有调用 finally?
【发布时间】:2011-12-17 09:27:55
【问题描述】:

我正在使用 FromEventPattern,我希望能够在我的 observable 的 finally 块中进行一些清理。现在 finally 块没有被调用。我的理解是我必须在某个地方调用 OnCompleted...,但不确定如何实现它。我的 Silverlight 程序中的一些代码:

    public IObservable<string> StartDownload ( string uri )
    {
         WebClient wc = new WebClient();
         var o = Observable.FromEventPattern<DownloadStringCompletedEventArgs>( wc, "DownloadStringCompleted" )
                           .Select( s => s.EventArgs.Result );
         wc.DownloadStringAsync( new Uri( uri ) );

     return o;
    }



  public void TestRx ()
  {
     var anobs = StartDownload( "http://www.google.com" );

     anobs
       .Subscribe( stuff =>
       {
          // do stuff
       } );

     anobs
       .Finally( () =>
       {
          // not called?
       } );
  }

更新: 显然,我认为 OnCompleted() 可以解决我的问题的假设是错误的。我尝试将 StartDownload 更改为以下内容,但仍然没有调用 finally。这是怎么回事?

  public IObservable<string> StartDownload ( string uri )
  {
     WebClient wc = new WebClient();

     var subject = new AsyncSubject<string>();

     wc.DownloadStringCompleted += ( sender, e ) => 
     {
        if ( e.Error != null )
           subject.OnError( e.Error );

        subject.OnNext( e.Result );
        subject.OnCompleted();
     };

     wc.DownloadStringAsync( new Uri( uri ) );         

     return subject;
  }

【问题讨论】:

标签: system.reactive


【解决方案1】:

您需要这样编写订阅代码:

anobs
    .Finally(() =>
        {
        // will now be called. ;-)
        })
    .Subscribe(stuff =>
        {
        // do stuff
        });

你的 Finally 调用返回一个新的 observable,它被“附加”到 anobs observable - 它对实际修改 anobs observable 没有任何作用。如果您直接订阅anobs,它对Finally 调用一无所知,因此无法调用它。

【讨论】:

  • 好的,行得通!应该注意的是,这只适用于我更新的 StartDownload 函数和 OnCompleted 调用。
【解决方案2】:

请记住,Rx 运算符与 LINQ 运算符完全一样,因为它们实际上不会做任何事情,除非您对它“ForEach”(即评估它)做一些事情。在 Rx 中,Subscribe 就像 ForEach。谜团在这里是正确的(但我想进一步解释一下为什么他是正确的!)

【讨论】:

    猜你喜欢
    • 2013-06-20
    • 1970-01-01
    • 1970-01-01
    • 2012-12-25
    • 1970-01-01
    • 1970-01-01
    • 2019-02-19
    • 2015-08-05
    • 1970-01-01
    相关资源
    最近更新 更多