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

推荐订阅源

D
Darknet – Hacking Tools, Hacker News & Cyber Security
V
Vulnerabilities – Threatpost
Cloudbric
Cloudbric
G
GRAHAM CLULEY
S
Securelist
Schneier on Security
Schneier on Security
Help Net Security
Help Net Security
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Project Zero
Project Zero
Spread Privacy
Spread Privacy
P
Privacy International News Feed
C
Cyber Attacks, Cyber Crime and Cyber Security
Cisco Talos Blog
Cisco Talos Blog
T
Tailwind CSS Blog
博客园_首页
有赞技术团队
有赞技术团队
Simon Willison's Weblog
Simon Willison's Weblog
Stack Overflow Blog
Stack Overflow Blog
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Latest news
Latest news
T
Tor Project blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Attack and Defense Labs
Attack and Defense Labs
www.infosecurity-magazine.com
www.infosecurity-magazine.com
O
OpenAI News
J
Java Code Geeks
T
Tenable Blog
K
Kaspersky official blog
AWS News Blog
AWS News Blog
S
Security @ Cisco Blogs
The GitHub Blog
The GitHub Blog
T
Threatpost
月光博客
月光博客
H
Heimdal Security Blog
Security Latest
Security Latest
The Hacker News
The Hacker News
Y
Y Combinator Blog
A
Arctic Wolf
Apple Machine Learning Research
Apple Machine Learning Research
C
Cisco Blogs
美团技术团队
Microsoft Security Blog
Microsoft Security Blog
Hugging Face - Blog
Hugging Face - Blog
T
The Blog of Author Tim Ferriss
C
CERT Recently Published Vulnerability Notes
D
Docker
Google Online Security Blog
Google Online Security Blog
D
DataBreaches.Net
V
Visual Studio Blog
H
Help Net Security

博客园 - Alen在西安

(转)关于教育些微的几个想法 寻找完美的 URL 验证正则表达式 【转发】 解决VS2012 Find and Replace (Ctrl+Shift+F) 不能正常工作的问题 会让你人生失败的31种原因(图 VS2012 DesignTime 笔记 DTE(vs2012) 编程相关笔记 免费用电信的wifi 简单反编译 chm 文件 如何减少silverlight XAP包的尺寸 测试绑定新浪微博 (转)Debug Silverlight in FireFox [转]CLR 全面透彻解析 - 将 APTCA 程序集迁移到 .NET Framework 4 在VS2010 "Choose Toolbox Item" Dialog 中显示自定义控件 笑话一则 Assembly 的 Shadow-Copy 所在的folder Silverlight 控件开发记录之 "extern alias” 关键字 安装完vS2010Beta2后请重置IDE设置 设置保护眼睛的背景色 又到五一了
读书笔记 - .net2.0 异步编程模型: 使用 IAsyncResult 调用异步方法
Alen在西安 · 2011-03-25 · via 博客园 - Alen在西安

微软早在.net2.0, 也就是VS2005的时候,就提供了一整套的异步编程设计模式,有3中常用的方式:

1. 使用 IAsyncResult 调用异步方法

2. 使用委托进行异步编程

3. 使用事件进行异步多线程编程

注: IAsyncResult 方式通常是用委托来实现的。所以可以认为前面2种方式就是一种。

http://msdn.microsoft.com/zh-cn/library/2e08f6yc.aspx

使用 IAsyncResult 调用异步方法

1. 有两个配对的方法,BeginXXX() 和 EndXXX()。它们是XXX()方法的异步执行。

BegingXXX()的参数是在XXX()的参数基础上增加 AsyncCallback 和 AsyncState。

EndXXX()的返回值和XXX()的返回值是一样的。

例如

 1 public delegate string AsyncMethodCaller((object param1, object param2);
 2 
 3 public class AsyncDemo
 4 
 5 {
 6 
 7 private AsyncMethodCaller _asyncDelegate = new AsyncMethodCaller(Run);
 8 
 9 public IAsyncResult BeginRun(object param1, object param2, AsyncCallback asyncCallBack, Object asyncState)
10 
11 {
12 
13 asyncDelegate.BeginInvoke(param1, param2, callBack, stateObject); 
14 }
15 
16 public object EndRun(IAsyncResult asyncResult)
17 
18 {
19 
20 m_asyncDelegate.EndInvoke(asyncResult); 
21 }
22 
23 Public object Run(object param1, object param2); 
24 }

2. IAsyncResult 对象中存储有关异步操作的信息。

3. 阻止应用程序执行的几种方法

a. 通过结束异步操作来阻止应用程序执行

就是EndXXX() 调用时,如果 IAsyncResult 对象表示异步操作未完成,则调用线程会被阻止,就是说它之后的逻辑的会被阻止。

1 IAsyncResult result = AsyncDemo.BeginRun(param1, param2, nullnull);
2 
3 AsyncDemo.EndRun(result);
4 
5 // when Run() method is completed. Continue to go.
6 
7 ContinueToGo();

b. 使用 AsyncWaitHandle 阻止应用程序的执行。

在BeingXXX()之后调用 IAsyncResult.AsyncWAitHandle 中的相应方法也可以阻止调用线程。例如

1 IAsyncResult result = AsyncDemo.BeginRun(param1, param2, nullnull);
2 
3 // Wait until the operation completes.
4 
5 result.AsyncWaitHandle.WaitOne();

c. 轮询异步操作的状态。

在BeingXXX()之后调轮询IAsyncResult.IsCompleted属性来确定此操作是否已完成

 1 IAsyncResult result = AsyncDemo.BeginRun(param1, param2, nullnull);
 2 
 3 While(result.IsCompleted != true)
 4 
 5 {
 6 
 7 // Waiting until IsCompleted is true. 
 8 }
 9 
10 // when Run() method is completed. Continue to go.
11 
12 ContinueToGo();

 

d. 使用 AsyncCallback 委托结束异步操作。

就是在代理里面根据具体情况调用Endxxx()方法来让调用线程继续运行。

 1 Public void MainFunc()
 2 
 3 {
 4 
 5 AsyncCallback callBack = new AsyncCallback(ProcessRun);
 6 
 7 IAsyncResult result = AsyncDemo.BeginRun(param1, param2, callBack, null);
 8 
 9 ContinueToGo();
10 
11 }
12 
13 Public void ProcessRun(IAsyncResult result) 
14 {
15 
16 AsyncDemo.EndRun(result);
17 
18 }