Voici une approche, en utilisant l'état mutable:
int lastPrime = 0; // or starting prime
IObservable<int> Primes =
Observable.Defer(() =>
{
do
{
lastPrime++;
} while (!IsPrime(lastPrime));
return Observable.Return(lastPrime);
}).Repeat();
var disp = Primes.Where(p => p < 1000000).Subscribe(Console.WriteLine);
/// ...
disp.Dispose();