預覽:Visual Basic與C#中的異步語法
在最近的博客文章中,Visual Basic團隊發布了一條簡單的消息,聲稱在Visual Basic和C#中將會增加異步編程語法。兩種語言新增的Async和Await關鍵字的實現將基于.NET 4.0中的任務并行庫(Task Parallel Library,TPL)。
Async關鍵字用于方法,它將啟用方法的異步行為。在這個方法中,Await關鍵字將暫停當前的執行流程,直到當前異步行為結束為止。線程不會因此而暫停,它可以用于處理其他工作,例如UI事件。一旦異步行為結束后,方法的將繼續執行余下部分。
以下是一個典型的WPF或WinForm應用程序中的“搜索”功能:
(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的版本大約如下所示:
(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 = TrueEnd Sub
據稱,C#和VB都會享有相同的設計、關鍵字及單元測試。因此C#版本看上去應該是這樣的:
(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中將會聽到這方面更多信息。
譯者注:PDC微軟最高級的專業技術人員會議。前幾天在PDC 2010會議上,Anders Hejlsberg發表了一場名為“C#與Visual Basic的未來”的演說,談論了未來C#和VB中最為重要的兩個特性:“異步(Async)”及“編譯器即服務(Compiler as a Service)”。國內社區的老趙對這場演講進行了詳細的總結,目前已經完成了關于異步編程的部分。
[英文出處]:Sneak Peak: Asynchronous Syntax for Visual Basic and C#