Cel*_*Cel 9 .net c# event-handling system.reactive
这是关于如何在特定事件相关方案中使用Reactive Extensions(Rx)的问题.
IObservable可以被任何客户订阅的(不知道事件类).EventArgspublic class HappenedEventArgs : EventArgs
{
internal bool IsBadNotGood;
}
Run Code Online (Sandbox Code Playgroud)
public class EventSourceA : IEventSource {
public event HappenedEventHandler Happened;
private void OnHappened(HappenedEventArgs e)
{
if (Happened != null)
Happened(this, e);
}
// And then this class calls OnHappened(e) whenever it decides to ...
}
public class EventSourceB : IEventSource {
public event HappenedEventHandler Happened;
private void OnHappened(HappenedEventArgs e)
{
if (Happened != null)
Happened(this, e);
}
// And then this class also calls OnHappened(e) at times ...
}
public interface IEventSource
{
event HappenedEventHandler Happened;
}
public delegate void HappenedEventHandler(object sender, HappenedEventArgs e);
Run Code Online (Sandbox Code Playgroud)
public class Pooler{
private IObservable<X> _pool;
public IObservable<X> Subscribe(){
return _pool;
}
public void Register(IEventSource item)
{
// How to take item.Happened and inject/bind it into _pool here?
}
internal void Unregister(IEventSource item)
{
// Disconnect item.Happened from _pool
}
public Pooler(){
// Instantiate _pool to whatever is best?
// _pool = ...
}
}
Run Code Online (Sandbox Code Playgroud)
static void Try() {
var pooler = new Pooler();
pooler.Subscribe().Subscribe(e =>
{
// Do something with events here, as they arrive
}
);
// ....
// Wherever whenever:
AddEventSources(pooler);
}
static void AddEventSources(Pooler pooler){
var eventSourceA = new EventSourceA();
pooler.Register(eventSourceA);
var eventSourceB = new EventSourceB();
pooler.Register(eventSourceB);
}
Run Code Online (Sandbox Code Playgroud)
Rx库试图提供的是处理诸如此类情况的方法,而无需创建一堆手动传播可观察对象的类/方法.
假设你有一个有活动的课程:
public class EventedClass
{
public event Action<EventArgs> Event;
}
Run Code Online (Sandbox Code Playgroud)
并且这些实例中有大量的实例IEnumerable<EventedClass> objects,您可以使用LINQ将observable投影到这些类中,将它们组合在一起Observable.Merge可以为您提供这些事件的组合顺序输出.
Observable.Merge(
objects.Select(
o => Observable.FromEvent<EventArgs>(
handler => o.Event += handler,
handler => o.Event -= handler
)
)).Subscribe(args =>
{
//do stuff
});
Run Code Online (Sandbox Code Playgroud)