C#巧用信号线程间通信

之前有用过nodejs ,一开始很不习惯 Nodejs的事情驱动, 因为它的IO 无阻塞,习惯阻塞情况下的编码 ,无阻塞反而很纳闷了。

在 nodejs IO虽然无阻塞的,导致文件,网络通信并不是和C#一样的执行方式,在nodejs中通过调用call back方法回调来完成一系列的调用。 习惯之后便会发现它的美妙了。比如在一个循环中,我要多次发送请求,每次响应后,再接着发送。那么在C#中很简单,因为端口的监听会阻塞住线程,直到接收到请求。所以只要发送新请求的代码在接收之后执行,就行。 

然而,同样的代码逻辑在nodejs下就不行了,它的通信不阻塞线程,所以,循环会在很短的时间内就跑完了,事实上,是在一时间内,将所有的请求全发送出去。并不能达到收到响应再发送下个请求的目的。  但是,可以将下次请求放在callback中。这样就保证了接收后再发送。这样的事件驱动从思维上讲仿佛比C#更容易理解。

今天在程序中遇到一个很有意思的地方。

static void Main(string[] args)
        {
            webSocket = new Client();
            // set event hander
            webSocket.ResponseEvent = ResponseHandler;
            webSocket.OpenEvent = OpenHandler;
            webSocket.CloseEvent = CloseHandler;
            webSocket.ErrorEvent = ErrorHandler;
            webSocket.MessageRecvEvent = MessageRecvHandler;

            manualEvent.Reset();
            manualEvent.WaitOne();
            Console.ReadKey();
        }
如上,如果没有 manualEvent, 那么主线程将会很快就执行完,而socket却未来得及执行。这样程序根本跑不起来。但是,我在主线程 通过manualEvent将主线程阻塞住,等待。 而在 soecket的 Reponse事件(异步的,在别的线程中执行)中 调用manualEvent的set方法,发送信号,让主线程接着执行下去。

这一系列过程,很像 nodejs下的一个普通的socket了。不过,它的主线程(执行javascript的线程)在异步操作结束前, 似乎并不会关闭,  不然这么保证异步完成呢? 这个有待考究。

 Any suggestions are welcome.

你可能感兴趣的:(C#巧用信号线程间通信)