当前位置:首页 » 软件开发
开发技术指南» 文章正文
    引言: 从William Kennedy那里整理过来的,不同之处在于他自
 

 

    摘要:编写者:郑昀@ultrapower 日期:2005-04-13 由于web service的执行身份受限,所以我们无法直接让web service申请作为一个soapreceiver,而是通过下面的web.config定义来制定本虚拟目录的.ashx终结点,从而通过ws_addressing和ws_messaging机制来完成与后台侦听服务之间的订阅/发布机制。<configuration&......
 ·将html表单数据存储为xml格式     »显示摘要«
    摘要:将html表单数据存储为xml格式 如你熟知asp,xml和html4。0,请读下列示例将表单数据存为xml格式  通常的,asp中表单提交的数据一般被写入数据库。然而,如果你想让发送数据更为简便易行,那么,可以将它书写为xml文件格式。这种方式对于在web上收集的数据更为有用。因为xml对于所用平台来说非常的简便,所以用不着转换数据格式。  将提交的数据写为xml文档,则需要通过microsof......


[C#]I/O完成端口的类定义和测试实例

从william kennedy那里整理过来的,不同之处在于他自己定义了一个overlapped,而我们这里直接使用 system.threading.nativeoverlapped.

附一段我以前的win32下的iocp文档,如果您了解iocp也可以直接跳过看后面的c#测试示范: 【程序编程相关:webconfig的设置节点说明

【推荐阅读:加入身份验证信息的SMTP mail发送

【扩展信息:现有的Web打印控制技术分成几种方案

 

整理者:郑昀@ultrapower

 

我们采用的是i/o complete port(以下简称iocp)处理机制.

简单的讲,当服务应用程序初始化时,它应该先创建一个i/o cp.我们在请求到来后,将得到的数据打包用postqueuedcompletionstatus发送到iocp中.这时需要创建一些个线程(7个线程/每cpu,再多就没有意义了)来处理发送到iocp端口的消息.实现步骤大致如下:

1     先在主线程中调用createiocompletionport创建iocp.

createiocompletionport的前三个参数只在把设备同complete port相关联时才有用.

此时我们只需传递invalid_handle_value,null与0即可.

第四个参数告诉端口同时能运行的最多线程数,这里设置为0,表示默认为当前计算机的cpu数目.

2     我们的threadfun线程函数执行一些初始化之后,将进入一个循环,该循环会在服务进程终止时才结束.

在循环中,调用getqueuedcompletionstatus,这样就把当前线程的id放入一个等待线程队列中,i/o cp内核对象就总能知道哪个线程在等待处理完成的i/o请求.

如果在idle_thread_timeout规定的时间内i/o cp上还没有出现一个completion packet,则转入下一次循环.在这里我们设置的idle_thread_timeout为1秒.

 

当端口的i/o完成队列中出现一项时,完成端口就唤醒等待线程队列中的这个线程,该线程将得到完成的i/o项中的信息:       传输的字节数.完成键与overlapped结构的地址.

 

在我们的程序中可以用智能指针或者bstr或者int来接受这个overlapped结构的地址的值,从而得到消息;然后在这个线程中处理消息.

getqueuedcompletionstatus的第一个参数hcompletionport指出了要监视哪一个端口,这里我们传送先前从createiocompletionport返回的端口句柄.

 

需要注意的是:

第一,   线程池的数目是有限制的,与cpu数目有关系.

第二,   iocp是一种较为完美的睡眠/唤醒 线程机制;线程当前没有任务要处理时,就进入睡眠状态,从而不占用cpu资源,直到被内核唤醒;

第三,   最近一次刚执行完的线程,下次任务来的时候还会唤醒它;所以有可能比较少被调用的线程以后被调用的几率也少.

 

 测试代码:


...   下一页
    摘要:添加引用system.enterpriseservices.dll using system.enterpriseservices; 随便建立一个按钮,在按钮中进行如下操作: try { work1(); work2(); contextutil.setcomplete(); } catch(system.exception except) { contextutil.setabort(); re......
» 本期热门文章:

©2000-2007 All Rights Reserved. 最佳浏览:1024X768 MSIE