Чтобы подробнее остановиться на этом, вы обычно можете определить, когда выбрать один из FromEvent
против FromEventPattern
по типу события, используемого в классе, который вы пытаетесь наблюдать. Используйте FromEventPattern
, когда ваше событие имеет тип EventHandler
или общий EventHandler<T>
. Используйте FromEvent
, когда вы используете нестандартный тип обработчика событий.
Следующие примеры взяты непосредственно из Rx wiki , в котором есть много хороших примеров - 101 из них , если быть точным.
FromEventPattern (с универсальным EventHandler) :
class ObserveEvent_Generic
{
public class SomeEventArgs : EventArgs { }
public static event EventHandler<SomeEventArgs> GenericEvent;
static void Main()
{
// To consume GenericEvent as an IObservable:
IObservable<EventPattern<SomeEventArgs>> eventAsObservable = Observable.FromEventPattern<SomeEventArgs>(
ev => GenericEvent += ev,
ev => GenericEvent -= ev );
}
}
FromEvent:
class ObserveEvent_NonGeneric
{
public class SomeEventArgs : EventArgs { }
public delegate void SomeNonGenericEventHandler(object sender, SomeEventArgs e);
public static event SomeNonGenericEventHandler NonGenericEvent;
static void Main()
{
// To consume NonGenericEvent as an IObservable, first inspect the type of EventArgs used in the second parameter of the delegate.
// In this case, it is SomeEventArgs. Then, use as shown below.
IObservable<IEvent<SomeEventArgs>> eventAsObservable = Observable.FromEvent(
(EventHandler<SomeEventArgs> ev) => new SomeNonGenericEventHandler(ev),
ev => NonGenericEvent += ev,
ev => NonGenericEvent -= ev);
}
}