热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C#巧用信号线程间通信

2019独角兽企业重金招聘Python工程师标准之前有用过nodejs,一开始很不习惯Nodejs的事情驱动,因为它的IO无阻塞,习惯阻塞情况下的

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

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

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

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

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

static void Main(string[] args){webSocket = new Client();// set event handerwebSocket.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



推荐阅读
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • 解决.net项目中未注册“microsoft.ACE.oledb.12.0”提供程序的方法
    在开发.net项目中,通过microsoft.ACE.oledb读取excel文件信息时,报错“未在本地计算机上注册“microsoft.ACE.oledb.12.0”提供程序”。本文提供了解决这个问题的方法,包括错误描述和代码示例。通过注册提供程序和修改连接字符串,可以成功读取excel文件信息。 ... [详细]
  • python3 nmap函数简介及使用方法
    本文介绍了python3 nmap函数的简介及使用方法,python-nmap是一个使用nmap进行端口扫描的python库,它可以生成nmap扫描报告,并帮助系统管理员进行自动化扫描任务和生成报告。同时,它也支持nmap脚本输出。文章详细介绍了python-nmap的几个py文件的功能和用途,包括__init__.py、nmap.py和test.py。__init__.py主要导入基本信息,nmap.py用于调用nmap的功能进行扫描,test.py用于测试是否可以利用nmap的扫描功能。 ... [详细]
  • RabbitMq之发布确认高级部分1.为什么会需要发布确认高级部分?在生产环境中由于一些不明原因,导致rabbitmq重启,在RabbitMQ重启期间生产者消息投递失败,导致消息丢 ... [详细]
  • java多线程获取线程返回结果
    我们在使用java多线程编写相关业务代码时,往往有这样一种情况,某个线程依赖于其他线程执行结果。也就是说,我们需要在一个线程中获取另一个线程的信息。可以分为两种情况,一种是轮询,一 ... [详细]
  • 作者一直强调的一个概念叫做oneloopperthread,撇开多线程不谈,本篇博文将学习,怎么将传统的IO复用pollepoll封装到C++类中。1.IO复用复习使用p ... [详细]
  • gitpod.io,云端开发调试工具。
    gitpod,一款在线开发调试工具,使用它你可以在网页上直接开发软件项目了。比如你的项目仓库在github上,你可以直接在网址的前面添加gitpod.io#,然后回车就能在网页上使 ... [详细]
  • Django3 使用 WebSocket 实现 WebShell
    △点击上方“Python猫”关注,回复“1”领取电子书剧照:《眷思量》作者:从零开始的程序员生活来源:https:www.c ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • Node.js详细安装及环境配置
    1、下载安装根据自己电脑系统及位数选择,我这里选择windows64位.msi格式安装包(官网:https:odejs.orgzh-cndownload).msi和.zip格式区别 ... [详细]
  • 为了让用户体验更好,页面前端往往是通过ajax来进行数据处理;由于浏览器的设计原因每个域名下的连接有 ... [详细]
  • 问题内容npmERR!code1npmERR!pathE:\WebProject\jeecgboot-vue3\node_modules\gifsiclenpmERR!com ... [详细]
author-avatar
氵殳冼臉_885
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有