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

推荐订阅源

D
Darknet – Hacking Tools, Hacker News & Cyber Security
Jina AI
Jina AI
博客园_首页
J
Java Code Geeks
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 司徒正美
Hugging Face - Blog
Hugging Face - Blog
S
SegmentFault 最新的问题
MyScale Blog
MyScale Blog
P
Proofpoint News Feed
L
Lohrmann on Cybersecurity
Forbes - Security
Forbes - Security
大猫的无限游戏
大猫的无限游戏
Vercel News
Vercel News
Y
Y Combinator Blog
Google DeepMind News
Google DeepMind News
The Register - Security
The Register - Security
N
News | PayPal Newsroom
S
Security Archives - TechRepublic
量子位
Cisco Talos Blog
Cisco Talos Blog
V
V2EX
C
Cisco Blogs
The Cloudflare Blog
Stack Overflow Blog
Stack Overflow Blog
L
LangChain Blog
Scott Helme
Scott Helme
S
Securelist
Security Latest
Security Latest
爱范儿
爱范儿
TaoSecurity Blog
TaoSecurity Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
I
Intezer
L
LINUX DO - 最新话题
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
C
Check Point Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
美团技术团队
Know Your Adversary
Know Your Adversary
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
PCI Perspectives
PCI Perspectives
月光博客
月光博客
T
Tailwind CSS Blog
Cloudbric
Cloudbric
小众软件
小众软件
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
K
Kaspersky official blog
D
DataBreaches.Net
博客园 - 【当耐特】
有赞技术团队
有赞技术团队

博客园 - Think

[开源]jquery.ellipsis根据宽度(不是字数)进行内容截断,支持多行内容 jquery代码链实现延时执行代码【补:几点注意】 根据用户选的背景色,自动匹配一个前景色 jquery代码链实现延时执行代码的较优雅办法 C++11智能指针处理Array对象 低端用户反文化----这个问题真这么简单? 放暑假了 jQuery 1.7.2 animate功能跨浏览器Bug修补 大数据块(BLOBs)与流(Stream)操作性能规范 SQL Antipatterns内容介绍 Chromium Embedded Framework中文文档 (使用C API) Chromium Embedded Framework中文文档 (如何链接不同的运行时) Chromium Embedded Framework中文文档 (SVN属性) Chromium Embedded Framework中文文档 (升级到最新的Chrome) Chromium Embedded Framework中文文档之(基本使用) Chromium Embedded Framework 中文文档(简介) 操盘之王 摘要 市场营销经典《引爆点》简摘 强制iphone界面马上旋转
AsyncEnumerator对EAP的支持
Think · 2012-02-08 · via 博客园 - Think

去年在异步编程中开始使用Wintellect's .NET Power Threading Library中的AsyncEnumerator,这个库通过将程序员较陌生的异步编程模型转化为程序员较熟悉的同步编程模型来实现异步操作,较大的改善了异步代码的易写、易读、易维护性。

目前对AsyncEnumerator介绍的文章已经比较多了,但集中于APM(Asynchronous Programming Model)模式中的应用,而.NET中,特别是Silverlight中还有很多对象是使用EAP(Event-based Asynchronous Pattern),对应的EAP与AsyncEnumerator结合的文章与例子很少,加上Jeffrey Richter不喜欢EAP模型,让我一度以为AsyncEnumerator不支持,于是自己去实现了EAP和AsyncEnumerator的结合。后来项目后期对代码重构时,有时间就再仔细看了看Power Threading的实现,发现其本身对EAP的支持是有封装的。下面是基于AsyncEnumerator使用Silverlight进行Socket通信的例子(Silverlight的Socket只有EAP模型):

SocketAsyncEventArgs socketEventArg = new SocketAsyncEventArgs();
socketEventArg.SocketClientAccessPolicyProtocol = SocketClientAccessPolicyProtocol.Tcp;
DnsEndPoint host = new DnsEndPoint(HtmlPage.Document.DocumentUri.Host, Configurations.PORT);
socketEventArg.RemoteEndPoint = host;
AsyncEnumerator asyncEnum = new AsyncEnumerator();
EventApmFactory<SocketAsyncEventArgs> eventApmFactory 
    = new EventApmFactory<SocketAsyncEventArgs>();
//异步代码组织在GetEnumerator()中
//IEnumerator<int> GetEnumerator(SocketAsyncEventArgs e,AsyncEnumerator ae){...}
var enumerator = GetEnumerator(socketEventArg,asyncEnum);
EventHandler<SocketAsyncEventArgs> eventHandler = 
    eventApmFactory.PrepareOperation(asyncEnum.End()).EventHandler;
socketEventArg.Completed += eventHandler;
asyncEnum.BeginExecute(enumerator, asyncEnum.EndExecute); 

其中关键的代码是: 

// 用EventApmFactory来创建一个Handler,这个Handler在每次事件触发时
// 调用asyncEnum.End(),将执行控制交还Enumerator,
// Enumerator接着上次yield return之后的地方执行
EventHandler<SocketAsyncEventArgs> eventHandler = 
    eventApmFactory.PrepareOperation(asyncEnum.End()).EventHandler;
socketEventArg.Completed += eventHandler; 

这个代码比我自己的EAP封装代码要简化很多,此外,Jeffrey在BLog中对Task与AsyncEnumerator的结合做了说明:

private static IEnumerator<Int32> AsyncEnumeratorAndTasks(AsyncEnumerator ae) {
   var t = new Task<DateTime>(() => { Thread.Sleep(10000); return DateTime.Now; });
   t.Start();
 
   // The Task tells the AsyncEnumerator when it is done
   
// If you don’t need to identify the Task, you can pass ‘null’ instead of ‘task’
   t.ContinueWith(task => ae.End()(task));
 
   yield return 1;      // Waits for the 1 Task to complete
 
   
// You MUST call DequeueAsyncResult to Remove the entry form the AsyncEnumerator object’s collection
   
// Casting the return value and assigning to ‘t’ is not necessary; since ‘t’ already refer to the same Task object
   t = (Task<DateTime>) ae.DequeueAsyncResult();        
 
   Console.WriteLine(t.Result);     // Shows the DateTime when the Task completed
}

参见:http://www.wintellect.com/CS/blogs/jeffreyr/archive/2009/10/12/using-net-4-0-tasks-with-the-asyncenumerator.aspx