BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

预览:Visual Basic与C#中的异步语法

| 作者 Jonathan Allen 关注 595 他的粉丝 ,译者 赵劼 关注 5 他的粉丝 发布于 2010年11月2日. 估计阅读时间: 7 分钟 | QCon上海2018 关注大数据平台技术选型、搭建、系统迁移和优化的经验。

在最近的博客文章中,Visual Basic团队发布了一条简单的消息,声称在Visual Basic和C#中将会增加异步编程语法。两种语言新增的Async和Await关键字的实现将基于.NET 4.0中的任务并行库(Task Parallel Library,TPL)。

Async关键字用于方法,它将启用方法的异步行为。在这个方法中,Await关键字将暂停当前的执行流程,直到当前异步行为结束为止。线程不会因此而暂停,它可以用于处理其他工作,例如UI事件。一旦异步行为结束后,方法的将继续执行余下部分。

以下是一个典型的WPF或WinForm应用程序中的“搜索”功能:

Private Sub SearchButton_Click(ByVal sender As Object, ByVal e As RoutedEventArgs) Handles SearchButton.Click
    ProgressBar1.Visibility = Visible
    SearchButton.IsEnabled = False

    Dim dt As DataTable = Nothing
    Dim worker As New BackgroundWorker

    AddHandler worker.DoWork, Sub()
        PrepareSearch()
        worker.ReportProgress(50)
        dt = SearchDatabase()
    End Sub

    AddHandler worker.RunWorkerCompleted, Sub()
        ResultsGrid.DataContext = dt
        ProgressBar1.Visibility = Visible
        SearchButton.IsEnabled = True
    End Sub
    
    AddHandler worker.ProgressChanged, 
            Function(a As Object, b As ProgressChangedEventArgs) _
                    ProgressBar1.Value = b.ProgressPercentage

    worker.RunWorkerAsync()
End Sub

根据博文所写,Async VB的版本大约如下所示:

Private Async Sub SearchButton_Click(ByVal sender As Object, ByVal e As RoutedEventArgs) Handles SearchButton.Click
    ProgressBar1.Visibility = Visible
    SearchButton.IsEnabled = False
    Await PrepareSearch()

    ProgressBar1.Value = 50
    ResultsGrid.DataContext = Await SearchDatabaseAsync()

    ProgressBar1.Visibility = Visible
    SearchButton.IsEnabled = True

End Sub

据称,C#和VB都会享有相同的设计、关键字及单元测试。因此C#版本看上去应该是这样的:

private async void SearchButton_Click(object sender, RoutedEventArgs e) {
    ProgressBar1.Visibility = Visibility.Visible;
    SearchButton.IsEnabled = false;
    await PrepareSearchAsync();

    ProgressBar1.Value = 50;
    ResultsGrid.DataContext = await SearchDatabaseAsync();

    ProgressBar1.Visibility = Visibility.Visible;
    SearchButton.IsEnabled = true;
}

在这些示例中,Async版本会返回一个Task对象。Await关键字后面的代码会形成一个回调函数,在Task完毕后执行。这里您可能想到CCR类库使用C#的“yield return”来创建continuation的做法。这不是巧合,事实上“await”重用了许多“yield return”代码。于是,VB团队也趁此机会,终于完成了它们的迭代器功能。

我们相信在PDC中将会听到这方面更多信息。

查看英文原文:Sneak Peak: Asynchronous Syntax for Visual Basic and C#

译者注:PDC微软最高级的专业技术人员会议。前几天在PDC 2010会议上,Anders Hejlsberg发表了一场名为“C#与Visual Basic的未来”的演说,谈论了未来C#和VB中最为重要的两个特性:“异步(Async)”及“编译器即服务(Compiler as a Service)”。国内社区的老赵对这场演讲进行了详细的总结,目前已经完成了关于异步编程的部分。

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

不能再折腾 by bulong xu

C#现在就已经是个又丑又恶心的大怪物。

Re: 不能再折腾 by shi mike

这些东西,不知道学习曲线陡不陡,如果很陡,那就成了小部分人的玩具了。

Re: 不能再折腾 by Jeffrey Zhao

我的观点正好相反,C#越来越是一个具备优雅及生产力的语言。

Re: 不能再折腾 by bulong xu

我的观点正好相反,C#越来越是一个具备优雅及生产力的语言。

如果在现有的C#(C#语法急需“重构”)上再开发一个C##,并且那些“语言之父们”谨慎的使用修改语法的权利的话。
还有生产力仅凭语法和BCL那是完全不够的,难道只用C#来开发一些自己用的小工具?那这个还轮不到C#的份,用那些动态语言会更舒服。以MS对待开源的态度...

Re: 不能再折腾 by Jeffrey Zhao

静态语言就不舒服吗?我觉得C#和Scala编程都很舒服,还有静态检查能力。还有动态语言静态语言跟开源又有什么关系……

Re: 不能再折腾 by bulong xu

静态语言就不舒服吗?我觉得C#和Scala编程都很舒服,还有静态检查能力。还有动态语言静态语言跟开源又有什么关系……
如果像是shell能解决的东西,你会去编码,编译,再使用吗?上面的话说的不完整,我的意思是指单凭BCL和语法很难解决掉开发中遇到的所有问题,我们就需要团队社区的力量。例如nunit怎么样?但MS还要去重新发明轮子再搞一套,MS自己有资本去浪费没得说,但这不是平白无故的增加开发者的学习成本吗?当然就这一个没什么好说的,积少成多啊!

Re: 不能再折腾 by Kuang Kurax

静态语言有静态语言的优势,动态语言也有动态语言的优势,但如果有语言可以把两种优势合并到一起,何乐而不为。

作为一个架构师,C#可以高效率地满足我的所有设计与开发任务。高效率这一点到底有多重要,不参与公司运营的人可能难以体会。

而所谓的很多“开源项目”,那个学习成本之高与开发效率之低才是效率之大敌。

在中国是缺乏创新的,因为抄袭太严重了,知识技术没有产权,GPL等协议得不到遵守,所以在中国讨论开发社区开源项目其实蛮扯的。

但作为盈利商业组织,我只要高效省事就可以了,强大不强大甚至都是次要的。

Re: 不能再折腾 by bulong xu

而所谓的很多“开源项目”,那个学习成本之高与开发效率之低才是效率之大敌。

如果要比的话,应该是用有“开源项目”,和“没有开源项目自己从零开始构建”对比,如果不用开源那你就不准备实现功能了吗?

Re: 不能再折腾 by Jeffrey Zhao

静态语言和有没有shell也没有关系,Haskell,F#,Scala都有REPL……其实你说的很多道理都对,但我就觉得和这里关系不大……

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

9 讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT