SlideShare a Scribd company logo
.NET平台编程语言
  异步特性演变
   赵劼 - 2012.2
关于我
• 赵劼 / 老赵 / Jeffrey Zhao / 赵姐夫
• 日写代码三百行,不辞长作程序员
• 博客:http://blog.zhaojie.me/
• 微博:@老赵
• F#, JavaScript, Scala, C#, Python, .NET, Mono...
• 痛恨Java语言
内容

• C# 1.0
• C# 2.0
• F#
• C# 5
C# 1.0
两种简单模型

• Begin / End 模型
• 事件模型
• 两种模型都基于回调函数
 •   “异步”所在
Begin / End 模型
delegate AsyncCallback(IAsyncResult);

interface IAsyncResult {
    object AsyncState { get; }
    ...
}

void BeginXyz(arg1, arg2, ..., AsyncCallback, state);

TResult EndXyz(IAsyncResult);
事件模型

class XyzCompletedEventArgs : EventArgs {
    Exception Error { get; }
    TResult Result { get; }
}

class Target {
    event EventHandler<XyzCompletedArgs> XyzCompleted;
    void XyzAsync(arg1, arg2, ...);
}
实现异步Transfer方法
示例⼀一

C# 1.0原生异步编程
The Evolution of Async Programming (GZ TechParty C#)
破坏了代码的局部性
• 线性代码表达更清晰,更符合习惯
• 异步会强迫拆分代码逻辑
 •   不能使用 if / using / while / for ...

• 难以
 •   组合异步操作
 •   异常处理
 •   取消操作
C# 2.0
“yield” for Iterators
  IEnumerable<int> Numbers() {

      yield return 0;
  	
      yield return 1;
  	
      yield return 2;

  }
“yield” for Iterators
             IEnumerable<int> Numbers() {
MoveNext()
                 yield return 0;
             	
                 yield return 1;
             	
                 yield return 2;

             }
“yield” for Iterators
             IEnumerable<int> Numbers() {
MoveNext()
                 yield return 0;
             	
MoveNext()
                 yield return 1;
             	
                 yield return 2;

             }
“yield” for Iterators
             IEnumerable<int> Numbers() {
MoveNext()
                 yield return 0;
             	
MoveNext()
                 yield return 1;
             	
MoveNext()
                 yield return 2;

             }
“yield” for Iterators
             IEnumerable<int> Numbers() {
MoveNext()
                 yield return 0;
             	
MoveNext()
                 yield return 1;
             	
MoveNext()
                 yield return 2;
MoveNext()
             }
示例二

C# 2.0的yield异步编程
“yield” 之与异步编程

• 带来新的异步编程模式
• 保持代码局部性
 •   优势:支持 if / using / while / for ...
 •   不完美:不支持 try...catch

• 可用来实现 Fibers:轻量的计算单元
F#
F# 编程语言
• 微软研究院Don Syme设计
• 强类型,静态类型
• 函数式编程语言,包含面向对象特性
• 面向业界及教育
•   开源(Apache 2.0)
•   微软提供跨平台支持
并发的挑战

• 状态共享 - 不可变性
• 代码局部性 - async { ... }
• I/O并行 - async { ... }
• 扩展至集群 - 使用 async { ... } 的代理
什么是 async { ... }
... the principle we go by is, don't expect to see
a particular concurrency model put into C#
because there're many different concurrency
model ... it's more about finding things are
common to to all kinds of concurrency ...

                              - Anders Hejlsberg
异步工作流
async { 	
    let! res = <async work>
    ...	
}
异步工作流
            React!
async { 	
    let! res = <async work>
    ...	
}
异步工作流
            React!
async { 	
    let! res = <async work>
    ...	
}
         HTTP 响应
           UI 事件
         Timer 回调
          查询结果
       Web Servcie 答复
          I/O 完成
          代理消息
async { ... } 工作方式
  async {
      let! img = AsyncRead "http://..."
      printfn "loaded!"
      do! AsyncWrite img @"c:..."
      printfn "saved!" }
async { ... } 工作方式
       async {
           let! img = AsyncRead "http://..."
           printfn "loaded!"
           do! AsyncWrite img @"c:..."
           printfn "saved!" }


                        =
async.Delay(fun ->
	 async.Bind(AsyncRead "http://...", (fun img ->
	 	 printfn "loaded!"
	 	 async.Bind(AsyncWrite img @"c:...", (fun () ->
	 	 	 printfn "saved!"
	 	 	 async.Return())))))
示例三

F# 异步工作流
C# 5
源代码

async Task<XElement> GetRssAsync(string url) {
    var client = new WebClient();
    var task = client.DownloadStringTaskAsync(url);
    var text = await task;
    var xml = XElement.Parse(text);
    return xml;
}
编译结果
Task<XElement> GetRssAsync(string url) {
    var $builder = AsyncMethodBuilder<XElement>.Create();
    var $state = 0;
    TaskAwaiter<string> $a1;
    Action $resume = delegate {
        try {
            if ($state == 1) goto L1;
            var client = new WebClient();
            var task = client.DownloadStringTaskAsync(url);
            $state = 1;
            $a1 = task.GetAwaiter();
            if ($a1.BeginAwait($resume)) return;
        L1: var text = $a1.EndAwait();
            var xml = XElement.Parse(text);
            $builder.SetResult(xml);
        }
        catch (Exception $ex) { $builder.SetException($ex); }
    };
    $resume();
    return $builder.Task;
}
示例四

C# 5 异步编程支持
示例五

Jscex:JS异步编程
Q &A
谢谢

More Related Content

What's hot (19)

PDF
Python 于 webgame 的应用
勇浩 赖
 
PDF
Node way
Ethan Zhang
 
PDF
Sigreturn Oriented Programming
Angel Boy
 
PDF
千呼萬喚始出來的 Java SE 7
Justin Lin
 
PDF
lambda/closure – JavaScript、Python、Scala 到 Java SE 7
Justin Lin
 
PDF
在開始工作以前,我以為我會寫扣。
Chih-Hsuan Kuo
 
PDF
Java8 lambda
koji lin
 
PDF
竞赛中C++语言拾遗
乐群 陈
 
PDF
使用 Java 上的 future/promise API
koji lin
 
PDF
JavaScript 教程
Bobby Zhou
 
PDF
Java script closures
skywalker1114
 
PDF
Execution
Angel Boy
 
PPTX
Introduction to Basic Haskell Components (In Chinese)
ChengHui Weng
 
PDF
Use Lambdas in Android
koji lin
 
PPTX
C++11综述/新特性描述/Overview of C++11 New Features
Peien Luo
 
PDF
Mokoversity Course: Apple Swift 101 - Introduction
Jollen Chen
 
PDF
nodeMCU IOT教學02 - Lua語言
吳錫修 (ShyiShiou Wu)
 
PDF
Binary exploitation - AIS3
Angel Boy
 
PPTX
Javascript share
Xu Mac
 
Python 于 webgame 的应用
勇浩 赖
 
Node way
Ethan Zhang
 
Sigreturn Oriented Programming
Angel Boy
 
千呼萬喚始出來的 Java SE 7
Justin Lin
 
lambda/closure – JavaScript、Python、Scala 到 Java SE 7
Justin Lin
 
在開始工作以前,我以為我會寫扣。
Chih-Hsuan Kuo
 
Java8 lambda
koji lin
 
竞赛中C++语言拾遗
乐群 陈
 
使用 Java 上的 future/promise API
koji lin
 
JavaScript 教程
Bobby Zhou
 
Java script closures
skywalker1114
 
Execution
Angel Boy
 
Introduction to Basic Haskell Components (In Chinese)
ChengHui Weng
 
Use Lambdas in Android
koji lin
 
C++11综述/新特性描述/Overview of C++11 New Features
Peien Luo
 
Mokoversity Course: Apple Swift 101 - Introduction
Jollen Chen
 
nodeMCU IOT教學02 - Lua語言
吳錫修 (ShyiShiou Wu)
 
Binary exploitation - AIS3
Angel Boy
 
Javascript share
Xu Mac
 

Viewers also liked (20)

PDF
LINQ Inside
jeffz
 
PDF
Web开发中的缓存
jeffz
 
PDF
分布式版本管理
jeffz
 
PDF
大话程序员可用的算法
jeffz
 
PPT
Ruby Past, Present, Future
adamfine
 
PDF
企业开发领域的语言特性
jeffz
 
PDF
Rabbit mq簡介(上)
共和 薛
 
PPTX
QML 與 C++ 的美麗邂逅
Jack Yang
 
PDF
Storm特性
zyh
 
PDF
鐵道女孩向前衝-RubyKaigi心得分享
Yu-Chen Chen
 
PDF
使用.NET构建轻量级分布式框架
jeffz
 
PDF
LWC15 典藏數位化-張其昀先生相關資料數位化之應用 報告人:中國文化大學圖書館 吳瑞秀館長
International Federation for information integration
 
PDF
臺北智慧城市專案辦公室公共住宅智慧社區服務說明書工作會議--智慧圖書館
Taipei Smart City PMO
 
PDF
我編譯故我在:誰說 Node.js 程式不能編成 binary
Fred Chien
 
PPTX
LWC14夢醒時分:圖書館建築構想書的實踐成果 以國立臺東大學圖書館為例。報告人:國立臺東大學圖書館 吳錦範組長
International Federation for information integration
 
PDF
Brig:Node.js + QML 華麗大冒險
Fred Chien
 
PDF
計概:Programming Paradigm
Rex Yuan
 
PPTX
新時代圖書館大未來
Ted Lin (林泰宏)
 
PDF
超酷炫科幻 UI:QML 入門
Fred Chien
 
PDF
試看VR的教育輕應用
Wayne Huang
 
LINQ Inside
jeffz
 
Web开发中的缓存
jeffz
 
分布式版本管理
jeffz
 
大话程序员可用的算法
jeffz
 
Ruby Past, Present, Future
adamfine
 
企业开发领域的语言特性
jeffz
 
Rabbit mq簡介(上)
共和 薛
 
QML 與 C++ 的美麗邂逅
Jack Yang
 
Storm特性
zyh
 
鐵道女孩向前衝-RubyKaigi心得分享
Yu-Chen Chen
 
使用.NET构建轻量级分布式框架
jeffz
 
LWC15 典藏數位化-張其昀先生相關資料數位化之應用 報告人:中國文化大學圖書館 吳瑞秀館長
International Federation for information integration
 
臺北智慧城市專案辦公室公共住宅智慧社區服務說明書工作會議--智慧圖書館
Taipei Smart City PMO
 
我編譯故我在:誰說 Node.js 程式不能編成 binary
Fred Chien
 
LWC14夢醒時分:圖書館建築構想書的實踐成果 以國立臺東大學圖書館為例。報告人:國立臺東大學圖書館 吳錦範組長
International Federation for information integration
 
Brig:Node.js + QML 華麗大冒險
Fred Chien
 
計概:Programming Paradigm
Rex Yuan
 
新時代圖書館大未來
Ted Lin (林泰宏)
 
超酷炫科幻 UI:QML 入門
Fred Chien
 
試看VR的教育輕應用
Wayne Huang
 
Ad

Similar to The Evolution of Async Programming (GZ TechParty C#) (20)

PPTX
异步编程与浏览器执行模型
keelii
 
PPT
千呼萬喚始出來的Java SE 7
javatwo2011
 
PPTX
Study4.TW .NET Conf 2018 - Fp in c#
Chieh Kai Yang
 
PDF
Node.js开发体验
QLeelulu
 
DOC
Java华为面试题
yiditushe
 
PDF
走马观花— Haskell Web 开发
Gump Law
 
PDF
所谓闭包
youzitang
 
PPT
Hi Haskell
Jifeng Deng
 
PPTX
Metro Style Apps from C++ Developers' View
Eric ShangKuan
 
PDF
Arduino應用系統設計 - Arduino程式快速入門
吳錫修 (ShyiShiou Wu)
 
PPT
C程式-函式與巨集
艾鍗科技
 
PDF
Arduino程式快速入門
吳錫修 (ShyiShiou Wu)
 
PDF
Python變數與資料運算
吳錫修 (ShyiShiou Wu)
 
PPTX
180518 ntut js and node
Peter Yi
 
PDF
JavaScript Engine
jay li
 
PPTX
ES5 introduction
otakustay
 
PDF
Java Jdk6学习笔记[Ppt]
yiditushe
 
PDF
關於 Javascript 非同步的那些事兒 公開版
Kirk Chen
 
PDF
D2_node在淘宝的应用实践_pdf版
Jackson Tian
 
PDF
JCConf 2024 - Java 22 & 23 新功能介紹
Joseph Kuo
 
异步编程与浏览器执行模型
keelii
 
千呼萬喚始出來的Java SE 7
javatwo2011
 
Study4.TW .NET Conf 2018 - Fp in c#
Chieh Kai Yang
 
Node.js开发体验
QLeelulu
 
Java华为面试题
yiditushe
 
走马观花— Haskell Web 开发
Gump Law
 
所谓闭包
youzitang
 
Hi Haskell
Jifeng Deng
 
Metro Style Apps from C++ Developers' View
Eric ShangKuan
 
Arduino應用系統設計 - Arduino程式快速入門
吳錫修 (ShyiShiou Wu)
 
C程式-函式與巨集
艾鍗科技
 
Arduino程式快速入門
吳錫修 (ShyiShiou Wu)
 
Python變數與資料運算
吳錫修 (ShyiShiou Wu)
 
180518 ntut js and node
Peter Yi
 
JavaScript Engine
jay li
 
ES5 introduction
otakustay
 
Java Jdk6学习笔记[Ppt]
yiditushe
 
關於 Javascript 非同步的那些事兒 公開版
Kirk Chen
 
D2_node在淘宝的应用实践_pdf版
Jackson Tian
 
JCConf 2024 - Java 22 & 23 新功能介紹
Joseph Kuo
 
Ad

More from jeffz (20)

PDF
深入浅出Jscex
jeffz
 
PDF
Mono for .NET Developers
jeffz
 
PDF
Javascript Uncommon Programming
jeffz
 
PDF
Jscex: Write Sexy JavaScript (中文)
jeffz
 
PDF
Jscex: Write Sexy JavaScript
jeffz
 
PDF
单点登录解决方案的架构与实现
jeffz
 
PDF
Documentation Insight技术架构与开发历程
jeffz
 
PDF
Windows Phone应用开发心得
jeffz
 
PDF
针对iPad平台的高性能网站架构
jeffz
 
PDF
The Evolution of Async-Programming on .NET Platform (TUP, Full)
jeffz
 
PDF
The Evolution of Async-Programming on .NET Platform (.Net China, C#)
jeffz
 
PDF
The Evolution of Async-Programming (SD 2.0, JavaScript)
jeffz
 
PDF
面向对象与生活
jeffz
 
PDF
Windows内核技术介绍
jeffz
 
PDF
响应式编程及框架
jeffz
 
PDF
F#语言对异步程序设计的支持
jeffz
 
PDF
大众点评网的技术变迁之路
jeffz
 
PDF
Better Framework Better Life
jeffz
 
PDF
Why Java Sucks and C# Rocks (Final)
jeffz
 
PDF
如何成为一名优秀的博主
jeffz
 
深入浅出Jscex
jeffz
 
Mono for .NET Developers
jeffz
 
Javascript Uncommon Programming
jeffz
 
Jscex: Write Sexy JavaScript (中文)
jeffz
 
Jscex: Write Sexy JavaScript
jeffz
 
单点登录解决方案的架构与实现
jeffz
 
Documentation Insight技术架构与开发历程
jeffz
 
Windows Phone应用开发心得
jeffz
 
针对iPad平台的高性能网站架构
jeffz
 
The Evolution of Async-Programming on .NET Platform (TUP, Full)
jeffz
 
The Evolution of Async-Programming on .NET Platform (.Net China, C#)
jeffz
 
The Evolution of Async-Programming (SD 2.0, JavaScript)
jeffz
 
面向对象与生活
jeffz
 
Windows内核技术介绍
jeffz
 
响应式编程及框架
jeffz
 
F#语言对异步程序设计的支持
jeffz
 
大众点评网的技术变迁之路
jeffz
 
Better Framework Better Life
jeffz
 
Why Java Sucks and C# Rocks (Final)
jeffz
 
如何成为一名优秀的博主
jeffz
 

The Evolution of Async Programming (GZ TechParty C#)