libuv是一个很强大的异步处理框架(严格意义上不能叫框架,其实就是一组异步函数库,当然框架这东西有各种各样的定义和理解_^...),最初的的目的是用于NODEJS的异步处理,不过因为它是一个独立的项目,可以独立于NODEJS存在,同时又可以跨平台(类UNIX平台基于LIBEV,WINDOWS平台基于IOCP),所以也有很多人直接把他当做异步处理库来使用,其中.net core 的Kestrel Sever就是基于它构建的 。

  因为WO对LIBUV理解的也不是很深入,所以就不详细的讲了,只把源码附上来,自己看源码,其中异步的部分是从网上找的TINYWEB的例子,只是和WINDOWS窗体应用程序进行了一次整合而已 。  特此说明  。

  还是遵循老习惯,先运行起来看看操作,至少先知道程序是个什么样子,是做什么用的 。

  第一步先下载源码 
  下载地址 : http://files.cnblogs.com/files/jivi/WinFormLibuvTest.zip

  下载下来后是一个压缩包,解压缩,目录结构

  

  WinFormLibuv.sln : VS2013的解决方案文件

  lib : libuv的头文件和Debug以及Release模式下的库文件放在这个目录里 (2016年11月3号)

  WinFomrLibuv 主程序目录

  打开 WinFormLibuv.sln  并运行程序,出现如下界面

  

  点击启动服务

  

  然后打开浏览器,输入地址 http://localhost:8080

  浏览器返加

  

  再看程序

  

  

程序很简单,就是一个简单的WEB服务器,监听端口8080 . 一旦有WEB请求了,就回复Welcome to tinyweb字样 。

因为WINDOWS应用程序有自己的消息(事件)循环 ,

LIBUV也有自己的事件循环,所以主要的点就是怎么融合这两个循环,其实方法很简单(不过官方不推荐这种方式)

while (true)
{
// 关键点在这里 在WINDOWS的消息循环里,使用UV_RUN_NOWAIT的方式执行LIBUV的事件循环
uv_run(uv_default_loop(), UV_RUN_NOWAIT);
if (GetMessage(&msg, NULL, 0, 0)){
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
else
{
break ;
}
}

当然这种方式对于DialogBox创建的模态窗体没用,因为DialogBox创建的模态窗体会有自己的消息循环,只有退出模态窗口才会回到主程序的消息循环 。

另外有没有其它副作用,也不知 。 :)

----------------------------------------------------------------------------------------------------------

  

 

  

  

  

  

  

Windows窗体应用程序(非Console)使用libuv实现简单的异步WEB服务器的更多相关文章

  1. C#开发Windows窗体应用程序的步骤

    使用C#开发应用程序时,一般包括创建项目.界面设计.设置属性.编写程序代码.保存项目.程序运行等6个步骤. 1.创建项目 在Visual Studio2017开发环境中选择“文件”→“新建”→“项目” ...

  2. 第一章 C#入门 (Windows窗体应用程序)(三)

    [案例] 编写一个Windows窗体应用程序,窗体上有一个文本框和两个按钮([显示]和[清除]按钮). 单击[显示]时,文本框的背景变为蓝色并且居中显示“努力学习C#”: 单击[清除]按钮,文本框的背 ...

  3. 第一章 C#入门(Windows窗体应用程序)(二)

    C#窗体应用程序(二) [案例]设计登录界面,效果如下: [案例实现步骤] 1.新建项目(Windows控制台应用程序 文件→新建→项目:选择“项目类型”为Visual C#,“模板”为Windows ...

  4. 第一章 C#入门 (Windows窗体应用程序)(一)

    我的第一个窗体应用程序(一) [案例说明]  在文本框中显示一行文字“Hello C#!”,单击[显示]按钮后在文本框中显示文字:单击[清除]按钮后清除文本框中的内容. [案例实现步骤] 1.新建项目 ...

  5. Windows窗体应用程序常用的几个类的属性、方法以及事件

    System.Diagnostics.Process 属性 public bool EnableRaisingEvents { get; set; }//获取或设置在进程终止时是否应激发 Exited ...

  6. C#windows窗体应用程序如何自适应大小

    用C#的windows窗体应用程序做界面十分轻松,但是系统默认是没有让控件跟随窗体的大小改变而已改变的.所以需要我们手动去设置让窗体控件随着窗体的大小改变而改变.所以我们只需要将控件选择 然后把Anc ...

  7. API、Win32 SDK、Win32项目、MFC、Windows窗体应用程序的区别

    [原]API.Win32 SDK.Win32项目.MFC.Windows窗体应用程序的区别 首先来看一下每一个术语的定义: API:Application Programming Interface. ...

  8. C#Windows窗体应用程序MyKTV项目

    后台管理其中有一个添加歌手信息和歌曲信息的窗体要点击按钮并上传文件,因为对那些文件流什么的不懂,所以用了老师教的最简单的判断方法,但此方法只是按后缀名判断文件的样式,如果后缀名乱改就不行了! 此时需要 ...

  9. 第三章 C#程序结构[3.2 选择结构的应用(Windows窗体应用程序)(四)]

    [案例]设计一个顾客选购商品的系统.其中,顾客身份有两类,一类是VIP,另一类是普通会员:商品种类有3种.分别是上衣.裤子和鞋子.其中,VIP享受8折优惠和商店赠送的礼品,而普通会员都不享受.单击[确 ...

随机推荐

  1. javac 不是内部或外部命令

    安装好JDK后 用     java                 命令测试OK! 用     java -version    命令测试OK! 用     javac                ...

  2. jQ $.extend用法

    $.extend()函数 1.用将一个对象或多个对象的内容合并到目标对象, 2.如果多个对象具有相同的属性,则后者覆盖前者的属性值. 例子: var object1={ apple:1, banana ...

  3. 软件工程 speedsnail 冲刺5

    2015-5-9 完成任务:学习了黑马android教学视频10\11\12集,填写游戏人的姓名功能为明天的记分板准备: 遇到问题: 问题1 Suspicious method call; shoul ...

  4. 代码分享:php对二维数组进行排序

    发布:net/PHP编程  编辑:thebaby   2013-06-28 13:12:54  [大 中 小] 转自:http://www.jbxue.com/article/9991.html本文介 ...

  5. delphi中表示跳出的有break,continue, exit,abort, halt, runerror

      1.break 强制退出循环(只能放在循环中),用于从For语句,while语句或repeat语句中强制退出. 2.continue 用于从For语句,while语句或repeat语句强行结束本次 ...

  6. ubuntu 14.04 下安装jdk8及 smartgithg

    公司使用git作为源码管理,又需要在ubuntu下工作,然后,自己就找了找,目前ubuntu下的git gui客户端,感觉 smartgit算是其中比较好用的一个,下边是具体安装步骤 说明,smart ...

  7. XAML(4) - 标记扩展

    在为元素设置值时, 可以直接设置值, 但有时标记扩展非常有帮助.标记扩展包含花括号,其后是定义了标记扩展类型的字符串标志. 下面是一个Static Resource标记扩展: <Button N ...

  8. MIFARE系列4《组成图》

    MIFARE集成电路芯片内含EEPROM.RF接口和数字控制单元. 1. RF射频接口 在RF射频接口电路中,主要包括有波形转换模块.它可将卡片读写器上的13.56MHZ的无线电调制频率接收,一方面送 ...

  9. ThinkPHP 3.2.2跨控制器调用方法

     所谓跨控制器调用,指的是在一个控制器中调用另一个控制器的某个方法.在ThinkPHP中有三种方式实现跨控制器调用: 直接实例化: A()函数实例化; R()函数实例化. (1)直接实例化  直接实例 ...

  10. MySQL快速生产表的描述

    # mysql快速生成表的描述 SELECT column_name AS `列名`, CONCAT_WS(' (', data_type, character_maximum_length) AS ...