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

  • 2010-10-31
  • 本文字数:1400 字

    阅读完需:约 5 分钟

在最近的博客文章中,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)”。国内社区的老赵对这场演讲进行了详细的总结,目前已经完成了关于异步编程的部分。