Without changing too much of your code, you could effectively concat a delay after the yield, and then repeat the whole thing indefinitely.
var observable = Observable.Create<string>(async observer =>
{
var wc = new WebClient { UseDefaultCredentials = true };
observer.OnNext(await wc.DownloadStringTaskAsync("http://ya.ru"));
});
observable
.Concat(Observable.Empty<string>().Delay(TimeSpan.FromSeconds(1)))
.Repeat()
.Subscribe(
res => Debug.WriteLine("got result: {0}", res),
exc => Debug.WriteLine("exception: {0}", exc.Message)
);
However, there's better ways of doing this, because in the previous instance you're creating a new WebClient every second. Instead, you could do something like this...
using System.Reactive.Threading.Tasks;
var observable = Observable.Using(() => new WebClient(), (client) =>
client.DownloadStringTaskAsync("http://ya.ru")
.ToObservable()
.Concat(Observable.Empty<string>().Delay(TimeSpan.FromSeconds(1)))
.Repeat()
);
And if you wanted to repeat on errors, you could add Retry
...
var observable = Observable.Using(() => new WebClient(), (client) =>
client.DownloadStringTaskAsync("http://ya.ru")
.ToObservable()
.Retry(3)
.Concat(Observable.Empty<string>().Delay(TimeSpan.FromSeconds(1)))
.Repeat()
);