How about this:
class Program
{
public event EventHandler<EventArgs> MyEvent;
static void Main(string[] args)
{
var myClass = new Program();
var task = new Task(() =>
{
for(var i=0; i<5; i++) {
myClass.MyEvent(myClass, new EventArgs());
}
throw new Exception();
});
var obsTask = task.ToObservable();
var events = Observable.FromEvent<EventArgs>(h => myClass.MyEvent += h, h => myClass.MyEvent -= h);
events.TakeUntil(obsTask).Subscribe(
ev => DoSomethingOnNext(ev),
ex => DoSomethingOnError(ex),
() => DoSomethingOnCompleted());
task.Start();
Console.ReadKey();
}
private static void DoSomethingOnCompleted()
{
Console.WriteLine("DoSomethingOnCompleted");
}
private static void DoSomethingOnError(Exception ex)
{
Console.WriteLine("DoSomethingOnError:" + ex.ToString());
}
private static void DoSomethingOnNext(IEvent<EventArgs> ev)
{
Console.WriteLine("DoSomethingOnNext:" + ev.ToString());
}
Conclusion:
DoSomethingOnNext: System.Collections.Generic.Event 1[System.EventArgs]
DoSomethingOnNext:System.Collections.Generic.Event 1 [System.EventArgs]
DoSomethingOnNext: System.Collections.Generic.Event 1[System.EventArgs]
DoSomethingOnNext:System.Collections.Generic.Event 1 [System.EventArgs]
DoSomethingOnNext: System.Collections.Generic.Event`1 [System.EventArgs]
DoSomethingOnError: System.AggregateException: . --- > System.Exception: "System.Exception". RxDisposeTests.Program. < > c_DisplayClass9.b_0() C:\Users\Richard.Hein\Documents\Visual Studio 2010\Projects\RxConsole\RxDisposeTests\Program.cs: 25 System.Threading.Tasks.Task.InnerInvoke() System.Threading.Tasks.Task.Execute() --- ---
--- > (Inner Exception # 0) System.Exception: "System.Exception". RxDisposeTests.Program. < > c_DisplayClass9.b_0() C:\Users\Richard.Hein\Documents\Visual Studio 2010\Projects\RxConsole\RxDisposeTests\Program.cs: 25 System.Threading.Tasks.Task.InnerInvoke() System.Threading.Tasks.Task.Execute() < ---
EDIT:
, TakeUntil , Task - , , ? :
var events = Observable.CreateWithDisposable<IEvent<EventArgs>>(observer =>
{
var eventObs = Observable.FromEvent<EventArgs>(
h => myClass.MyEvent += h, h => myClass.MyEvent -= h);
task.ToObservable().Subscribe(_ => { }, observer.OnError, observer.OnCompleted);
return eventObs.Subscribe(observer.OnNext, observer.OnError, observer.OnCompleted);
});
events.Subscribe(
ev => DoSomethingOnNext(ev),
ex => DoSomethingOnError(ex),
() => DoSomethingOnCompleted());