惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

N
News and Events Feed by Topic
F
Fortinet All Blogs
J
Java Code Geeks
GbyAI
GbyAI
Engineering at Meta
Engineering at Meta
P
Privacy International News Feed
V
Visual Studio Blog
Martin Fowler
Martin Fowler
博客园 - 司徒正美
A
Arctic Wolf
M
MIT News - Artificial intelligence
Blog — PlanetScale
Blog — PlanetScale
U
Unit 42
Scott Helme
Scott Helme
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
P
Proofpoint News Feed
P
Palo Alto Networks Blog
S
Securelist
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
T
Threatpost
S
SegmentFault 最新的问题
AWS News Blog
AWS News Blog
MongoDB | Blog
MongoDB | Blog
Apple Machine Learning Research
Apple Machine Learning Research
K
Kaspersky official blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
T
The Exploit Database - CXSecurity.com
Google DeepMind News
Google DeepMind News
A
About on SuperTechFans
月光博客
月光博客
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
C
CXSECURITY Database RSS Feed - CXSecurity.com
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
NISL@THU
NISL@THU
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Latest news
Latest news
Y
Y Combinator Blog
PCI Perspectives
PCI Perspectives
S
Security Affairs
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
B
Blog RSS Feed
O
OpenAI News
Google Online Security Blog
Google Online Security Blog
The Hacker News
The Hacker News
博客园 - Franky
Attack and Defense Labs
Attack and Defense Labs
Hugging Face - Blog
Hugging Face - Blog
N
Netflix TechBlog - Medium
The GitHub Blog
The GitHub Blog
T
Troy Hunt's Blog

博客园 - ymz

C#异常的一些使用原则 【转】[翻译]Visual Studio2008的新功能:代码度量 【转】也谈c#调用C++的DLL找不到入口点 Develope express学习 【摘】异源数据转换与FDO数据访问 线程同步 【转】ArcEngine中创建自定义工具 【转贴】利用 Javascript 获取 URL 参数(适合IE、FF) - ymz 【转】HTML标签大全 MapGuide常见错误解决方法 集合类及泛型 一个网站系统的经验 frameset学习摘录 【转】如何使用.NET配置文件by沐枫小筑 【转】Notes on the Eclipse Plug-in Architecture 【转】理解session机制 困扰了一天的字符集转换问题 【转】Sys.WebForms.PageRequestManagerParserErrorException - what it is and how to avoid it 【转】获取GridView单元格值的通用函数
线程异步
ymz · 2009-04-01 · via 博客园 - ymz

使用专用线程执行受限制的异步操作
需要创建线程池以外线程的情况:
1.如果希望线程以一个特殊的优先级(所有线程池中的线程都是以普通优先级运行,而且我们不应该修改线程池中线程的优先级)运行,就需要创建一个专用的线程。
2.同样,所有线程池中的线程都是后台线程,若希望让一个线程成为前台线程,也可以考虑创建并使用自己的线程,从而阻止应用程序“死亡”,直至线程完成任务。
3.如果受限制的任务运行时间特别长,还会使用专用线程。这样我们就不必让线程池的逻辑去费力地判断是否还需要创建额外的线程。
4.如果希望启动一个线程,然后通过调用Thread的Abort方法过早地中断该线程的话,也可以使用一个专用线程。
异步操作的另一种方法:Join(),此方法导致调用线程停止执行任何代码,直至其等待的线自己销毁自己或者被终止。


定期执行受计算限制的异步操作
FCL中提供的三个定时器:
System.Threading.Timer:希望在另一个线程上定时执行后台任务时,这个定时器是最好的定时器。
System.Windows.Forms.Timer:随着定时器的触发,Windows将一个定时器消息(WM_TIMER),插入到线程的消息队列中,调用线程必须执行一个消息泵(message pump),从而提取消息,并将它们分派到期望的回调方法中。注意,所有这些工作都是由一个线程完成的——设置定时器的线程是保证执行回调方法的线程。这同样意味着我们的定时器不能被多个线程同时执行。
System.Timers.Timer:该类实际上是对System.Threading中的Timer类的包装,不建议使用。


异步编程模型简介
异步编程模式(APM)的具体示例:
所有派生自System.IO.Stream并与硬件设备(包括FileStream和NetworkStream)进行通信的类都提供了BeginRead和BeginWrite方法。注意,派生自Stream的类不与硬件设备进行通信的类(如BufferedStream,MemoryStream以及CrytoStream)进行通信的类也提供了BeginRead和BeginWrite方法适合APM。但是这些方法中的代码只执行受计算限制的操作,而不能执行受I/O限制的操作,因此需要一个线程来执行这些操作。
另外,所有的委托类型都定义了一个BeginInvoke方法来使用APM。
APM的一个主要特征就是它提供了三个聚集的技巧,而线程池中并没有提供内置的方法来供我们查找异步操作是何时完成的。


由于I/0的速度较慢且运行情况不可预知,适合采用异步的方式来实现,网络也存在同样的情况。若使用FileStream来实现异步读写,首先指定FileOptions.Asynchronous标记,通过BeginRead/BeginWrite实现异步读写。

APM的三个聚集技巧
APM支持以下三种聚集技巧:等待直至完成(wait-until-done)、轮询(polling)、方法回调(method callback)。
wait-until-done:为了启动一个异步操作,我们可以调用一些Begin方法,所有这些方法都会将请求操作排队,然后返回一个IAsyncResult对象标识挂起的操作。为了获得操作的结果,我们可以以IAsyncResult对象为参数调用相应的End方法。
polling:利用IAsyncResult对象中的IsCompleted,以及WaitHandle AsyncWaitHandle委托来循环判断是否已经完成异步操作。不建议使用,因为这实际上是浪费了一个线程的时间来查看异步请求是否已经完成。
method callback:在所有的APM聚集技巧中,构建高性能和可扩展应用程序架构时,方法回调聚集技巧最好用。原因在于该技巧永远不会将一个线程置于等待状态(与wait-until-done聚集技巧不同),而且该技巧不会定期地检查异步操作是否已经完成而浪费CPU时间(与polling聚集技巧也不同)。
其工作原理是:首先将异步请求排队等候,然后线程继续执行它希望执行的任何事情。接着,当请求完成时,windows将工作项加入CLR的线程池队列中。最后,线程池中的线程将工作项从队列中取出,并调用我们编写的一些方法,通过这种方式我么可以知道异步操作已经完成。然后,在回调方法内部,我们首先调用End方法获取异步操作的结果,然后就可以自由地继续处理结果。

异步线程的执行上下文

Code