使用F#简化异步编程.NET中的异步编程:
来源:互联网 发布:朱茵的眼睛知乎 编辑:程序博客网 时间:2024/05/21 08:03
#div_codimg{border:0px;}
Async.StartWithContinuasyncDownload"http://www.google.
或多或少总是感觉不那么“正统”有点hack感觉。这种感觉在实验阶段倒还可以,不论是使用yield或借助第三方类库来简化异步编程。要是用在产品中总有点担心,即使这些类库来自权威的第三方,不知道大家有没有跟我同样的感觉。那么这个时候我就会想,如果在语言中直接能提供这种机制该多好呢。
系列文章回顾:.NET开发中的异步编程:第三方类库
.NET中的异步编程:为什么需要异步
.NET异步编程:IO完成端口与BeginRead
.NET异步编程:使用CPS及yield实现异步
.NET中的异步编程:保守的异步编程
F#异步工作流
新包含了一种语言:F#F#一大特性就是异步计算。能让你用同步的方式编写异步的代码,VisualStudio2010中。不必使用AsyncCallback回调将一个方法分为两段,也不必注册异步完成事件。
现在2.0版本,F#一个强类型的函数式编程语言。VS2010中正式作为first-class语言呈现。其主要设计者是DonSyme同是.NET中的泛型的主要设计者之一。
来看看前面几篇文章中都包含的那个示例使用F#代码将是怎样:
letasyncDownloadurl:string=
async{
letreq=WebRequest.Crurl
let!resp=req.A syncGetRespons
usstream=resp.GetResponseStream
letreader=newStreamReadstream
returnreader.ReadToEnd
}
但为了说明异步的编写方式,很短小精悍吧(实际上这段代码可以更短。没有使用那些看起来有点“怪”语法)下面我来解读一下这段代码,希望本文结束后你能对F#中的异步有点初步的印象。
比方:F#中用let定义一个值。
letvalu=5
F#函数式编程语言,不过上面的代码是用let定义一个函数。不过请记住。这里函数也是值。观察上面的代码,let后面是函数名,然后跟着函数的参数列表(url:stringF#有强大的类型推断能力,一般情况下参数的类型是不需要写的但是这个代码中因为WebRequest.Cr方法有多个重载方式,所以无法推断出url类型,需要加上string注意这里定义类型的方式。
实际上是AsyncBuild一个全局示例。而被包括在async{}内的一些操作被转换为FSharpA syncBuild方法调用,下面是本问最有趣的地方了async{}这就是所谓的异步工作流。这种使用方式在F#里称之为工作流(Workflow注意,这和业务系统中的工作流程系统是不同的关于工作流我会在下一篇文章中详细介绍。现在只需要知道async{}执行的结果放回的一个Async<a>泛型)类型的东西,这个东西表示一个可以被调度运行的任务,可以这样使用这个方法:
A sync.RunSynchronasyncDownload"http://www.google.com"
然后阻塞线程等待返回结果。 Async.RunSynchron会将asyncDownload返回的这个异步任务放到线程池中执行。
但是并不阻塞线程。当从远程服务器拿到响应后会接着执行req.A syncGetRespons后面的内容。这样就用非常自然的同步顺序的方式,这里需要说明的前面下载网页内容的代码是异步执行的当调用req.A syncGetRespons时只是注册异步回调。编写出异步的代码。这比之前使用各种第三方类库的hack方式看起来更自然。至于这种方式面前的实现原理,敬请期待下篇文章。
但这里存在一个问题是如果我现在场景是这样的
点击按钮后下载网页内容,Winform窗体上有一个按钮。然后将内容显示在页面上的一个文本框中。那么这里使用Async.RunSynchron就不是个好注意。RunSynchron会阻塞UI线程直到返回结果,那么我本系列开始的时候提到构建灵敏的UI目的就没有达到不能阻塞UI线程,应该让它执行完毕后调用我代码将内容显示在文本框中。幸好Async提供了StartWithContinu方法,就可以这样来执行我下载顺序了
- 使用F#简化异步编程.NET中的异步编程:
- 使用任务简化异步编程
- 使用 Task 简化异步编程
- .NET中的异步编程
- ASP.NET中的异步编程
- ASP.NET中的异步编程
- 使用.NET 异步编程(1)
- 使用.NET 异步编程(2)
- 使用.NET 异步编程(2)
- 使用.NET 异步编程(1)
- .NET 中的 async/await 异步编程
- .NET 中的 async/await 异步编程
- .NET 中的 async/await 异步编程
- .NET中的异步编程(三)- Continuation passing style以及使用yield实现异步
- .net异步编程
- .net异步编程
- .net异步编程
- .net异步编程
- android绚丽的ListView表格效果的实现
- Android dex ,xml 文件反编译方法
- Java API for XML
- Y型领导的箴言
- 基于电子商务安全的框架研究和设计思想
- 使用F#简化异步编程.NET中的异步编程:
- 最小生成树的prim算法(java)
- truncate和不带where子句的delete, 以及drop都会删除表内的数据
- 记录一些对自己有帮助的博客
- 细节详解.NET中的委托
- C++的指针与引用
- 标签-使用JSTL的format标签
- Delphi中String与WideString的区别
- 顺序栈实现算术运算。