C#学习:event和observer

写在前面

疑问的产生是对一个TaskCompletionSource的一系列工作方式产生疑问,根源是对事件的产生与处理机制不甚了解

主要思路

一个对象能根据某种状态的改变发送消息,即产生一个事件;

一个方法可以订阅某个事件,当事件发生时进行触发

具体分析

在异步中的应用

需求

需要等待peer.PeersDataReceived这个事件发生后,再进行peers显示的相关操作

则令方法Peer1_PeersDataReceived()订阅该事件

peer.PeersDataReceived += Peer1_PeersDataReceived;

而方法中对一个TaskCompletionSource类型的对象completionSource进行执行TrySetResult()

        private static void Peer1_PeersDataReceived(object sender, EventArgs e)
        {
            var a = completionSource.TrySetResult();

            return;
        }

当该方法调用后返回,则异步等待的下列语句得到执行,程序继续运行

await completionSource.Task;

关于observer design pattern

对事件的监听是通过观察者设计模式实现的

provider

public class BaggageHandler : IObservable<BaggageInfo>

拥有一系列observer,将需要提供的信息逐个发送给它们

foreach (var observer in observers)
            observer.OnNext(info);

结束提供消息,调用 OnCompleted() 方法

observer

实现订阅subscribe。由于需要在取消订阅后,则在进行订阅时返回一个IDisposable类型的对象,相当于进行标记。而这个对象实现Dispose()的方法,即可以自主取消订阅。

参考资料