Skip to content

Instantly share code, notes, and snippets.

@follesoe
Created June 25, 2018 18:30
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save follesoe/70ed091e3d5f13c7b4138e071687088d to your computer and use it in GitHub Desktop.
Save follesoe/70ed091e3d5f13c7b4138e071687088d to your computer and use it in GitHub Desktop.
Attempt at extending example further
static void Main(string[] args)
{
var browser = new ServiceBrowser();
var observableFound =
Observable.FromEventPattern<ServiceFoundEventArgs>(
h => browser.ServiceFound += h,
h => browser.ServiceFound -= h)
.Select(e => e.EventArgs.Service);
var observableError =
Observable.FromEventPattern<ServiceSearchErrorEventArgs>(
h => browser.ServiceError += h,
h => browser.ServiceError -= h);
var observableFoundWithError = observableFound
.Materialize()
.Merge(
observableError
.Materialize()
.Select(x => Notification.CreateOnError<Service>(new Exception("Error"))))
.Dematerialize()
.Synchronize();
var subject = new Subject<Service>();
var sub = observableFoundWithError.Subscribe(s =>
{
var observableResolved = Observable.FromEventPattern<EventArgs>(
h => s.AddressResolved += h,
h => s.AddressResolved -= h);
var observableResolveError = Observable.FromEventPattern<EventArgs>(
h => s.ErrorResolvingAddress += h,
h => s.ErrorResolvingAddress -= h);
var observableResolvedWithError = observableResolved
.Materialize()
.Merge(
observableResolveError
.Do(e => Console.WriteLine($"Error resolving: {s.Name}"))
.Materialize()
.Select(x => Notification.CreateOnError<EventPattern<EventArgs>>(new Exception($"Error resolving address for service: {s.Name}"))))
.Dematerialize()
.Synchronize();
var resolveSub = observableResolved.Subscribe(
r => subject.OnNext(s),
ex => subject.OnError(ex),
() => Console.WriteLine("Resolve Completed"));
s.ResolveAddress();
});
using (subject.Subscribe(
s => Console.WriteLine($"Found and resolved service: {s.Name} ({s.Address})"),
ex => Console.WriteLine($"Found error: {ex.Message}"),
() => Console.WriteLine("Found Completed")))
{
browser.Search();
Console.ReadLine();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment