0

我正在阅读IntroToRx,但示例代码遇到了一些问题。这是我的代码的总和:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reactive.Disposables;
using System.Reactive.Linq;
using System.Reactive.Subjects;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace LearningReactiveExtensions
{
  public class Program
  {
    static void Main(string[] args)
    {
        var observable = Observable.Interval(TimeSpan.FromSeconds(5));
        observable.Subscribe(
          Console.WriteLine, 
          () => Console.WriteLine("Completed")
        );
        Console.WriteLine("Done");
        Console.ReadKey();
    }

  }
}

如果我正确理解这本书,这应该将一个数字序列写入控制台,永远每五秒一次,因为我从来没有Dispose()这个序列。

但是,当我运行代码时,我得到的只是最后的“完成”。没有数字,没有“完成”,只有“完成”。

我在这里做错了什么?

4

2 回答 2

2

我假设您没有耐心等待 5 秒钟,否则您会看到代码正在运行。

要记住的主要思想RxObservable.Subscribe几乎立即将控制权返回给调用方法。换句话说,Observable.Subscribe在结果产生之前不会阻塞。因此,Console.WriteLine仅在五秒钟后调用 to。

于 2013-08-24T07:38:28.313 回答
0

你需要一些方法让主线程等待你正在做的事情。如果您愿意,可以使用信号量

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reactive.Disposables;
using System.Reactive.Linq;
using System.Reactive.Subjects;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace LearningReactiveExtensions
{
  public class Program
  {
    static void Main(string[] args)
    {
         SemaphoreSlim ss = new SemaphoreSlim(1);
        var observable = Observable.Interval(TimeSpan.FromSeconds(5));
        observable.Subscribe(
          Console.WriteLine, 
          () => {
               Console.WriteLine("Completed");
               ss.Release();
          }
        );
        ss.Wait();
        Console.WriteLine("Done");
        Console.ReadKey();
    }

  }
}

虽然在这种情况下可能更好只是写

  static void Main(string[] args)
   {
        SemaphoreSlim ss = new SemaphoreSlim(1);
        Observable.Interval(TimeSpan.FromSeconds(5)).Wait();
        Console.WriteLine("Completed");
        Console.WriteLine("Done");
        Console.ReadKey();
   }
于 2013-08-24T08:51:08.163 回答