C#巧用信号线程间通信

本文探讨了Node.js与C#两种语言在异步编程方面的不同之处,特别是Node.js的事件驱动机制和C#中的阻塞与非阻塞IO处理方式。通过具体的编程实例,展示了如何在Node.js中利用回调实现按序请求发送,以及在C#中如何通过手动事件对象来确保主线程等待异步操作完成。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前有用过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.

转载于:https://my.oschina.net/u/867090/blog/160630

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值