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

PDF
JavaScript现代化排错实践
PDF
Wind.js无障碍调试与排错
PDF
Jscex:案例、经验、阻碍、展望
PDF
Jscex:案例、阻碍、体会、展望
PDF
深入淺出 Web 容器 - Tomcat 原始碼分析
PDF
论 Python 与设计模式。
PPT
页游开发中的 Python 组件与模式
PPT
Javascript Training
JavaScript现代化排错实践
Wind.js无障碍调试与排错
Jscex:案例、经验、阻碍、展望
Jscex:案例、阻碍、体会、展望
深入淺出 Web 容器 - Tomcat 原始碼分析
论 Python 与设计模式。
页游开发中的 Python 组件与模式
Javascript Training

What's hot (19)

PDF
Python 于 webgame 的应用
PDF
Node way
PDF
Sigreturn Oriented Programming
PDF
千呼萬喚始出來的 Java SE 7
PDF
lambda/closure – JavaScript、Python、Scala 到 Java SE 7
PDF
在開始工作以前,我以為我會寫扣。
PDF
Java8 lambda
PDF
竞赛中C++语言拾遗
PDF
使用 Java 上的 future/promise API
PDF
JavaScript 教程
PDF
Java script closures
PDF
Execution
PPTX
Introduction to Basic Haskell Components (In Chinese)
PDF
Use Lambdas in Android
PPTX
C++11综述/新特性描述/Overview of C++11 New Features
PDF
Mokoversity Course: Apple Swift 101 - Introduction
PDF
nodeMCU IOT教學02 - Lua語言
PDF
Binary exploitation - AIS3
PPTX
Javascript share
Python 于 webgame 的应用
Node way
Sigreturn Oriented Programming
千呼萬喚始出來的 Java SE 7
lambda/closure – JavaScript、Python、Scala 到 Java SE 7
在開始工作以前,我以為我會寫扣。
Java8 lambda
竞赛中C++语言拾遗
使用 Java 上的 future/promise API
JavaScript 教程
Java script closures
Execution
Introduction to Basic Haskell Components (In Chinese)
Use Lambdas in Android
C++11综述/新特性描述/Overview of C++11 New Features
Mokoversity Course: Apple Swift 101 - Introduction
nodeMCU IOT教學02 - Lua語言
Binary exploitation - AIS3
Javascript share
Ad

Viewers also liked (20)

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

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

PPTX
异步编程与浏览器执行模型
PPT
千呼萬喚始出來的Java SE 7
PPTX
Study4.TW .NET Conf 2018 - Fp in c#
PDF
Node.js开发体验
DOC
Java华为面试题
PDF
走马观花— Haskell Web 开发
PDF
所谓闭包
PPT
Hi Haskell
PPTX
Metro Style Apps from C++ Developers' View
PDF
Arduino應用系統設計 - Arduino程式快速入門
PPT
C程式-函式與巨集
PDF
Arduino程式快速入門
PDF
Python變數與資料運算
PPTX
180518 ntut js and node
PDF
JavaScript Engine
PPTX
ES5 introduction
PDF
Java Jdk6学习笔记[Ppt]
PDF
關於 Javascript 非同步的那些事兒 公開版
PDF
D2_node在淘宝的应用实践_pdf版
PDF
JCConf 2024 - Java 22 & 23 新功能介紹
异步编程与浏览器执行模型
千呼萬喚始出來的Java SE 7
Study4.TW .NET Conf 2018 - Fp in c#
Node.js开发体验
Java华为面试题
走马观花— Haskell Web 开发
所谓闭包
Hi Haskell
Metro Style Apps from C++ Developers' View
Arduino應用系統設計 - Arduino程式快速入門
C程式-函式與巨集
Arduino程式快速入門
Python變數與資料運算
180518 ntut js and node
JavaScript Engine
ES5 introduction
Java Jdk6学习笔记[Ppt]
關於 Javascript 非同步的那些事兒 公開版
D2_node在淘宝的应用实践_pdf版
JCConf 2024 - Java 22 & 23 新功能介紹

More from jeffz (20)

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

The Evolution of Async Programming (GZ TechParty C#)