C#巧用信号线程间通讯

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

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

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

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

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的线程)在异步操做结束前, 彷佛并不会关闭,  否则这么保证异步完成呢? 这个有待考究。 c#

 Any suggestions are welcome. 网络

相关文章
相关标签/搜索