最近ポストされて、その後削除されたVisual Basicチームのブログにおいて、Visual BasicとC#に新しい非同期プログラミングのシンタックスを発表することを漏らしてしまった。.NET 4で紹介されたTask Parallel Libraryの上に組み込まれ、AsyncとAwaitキーワードが両方の言語に追加される。
Asyncキーワードは、functionかメソッドに適用される。functionにおいて非同期の振る舞いを許可するときに現れる。functionの中のAwaitキーワードは、以下のアクションを完了するまで現在のメソッドが停止される。スレッド自身は停止されない。これは、UIイベントへの応答のような他のアクションを実行するために開放されている。ある非同期アクションが完了すると、functionは再開される。
これは、WPFやWinFormsアプリケーションの典型的な[検索]ボタンの例である。
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;
}
これらの例では、functionのAsyncバージョンは、Taskオブジェクトに返って来る。Awaitキーワードの後続行のコードは、Taskオブジェクトの実行が完了すると、処理が戻されるように機能する。ここでは、C#の“yield return”キーワードを使って継続するためにどのようにCCRライブラリが使われるのかを思い出すだろう。これは、偶然ではなく、“await”に使われているコードの大部分は、“yield return”のコードから再利用された。ある面のメリットとして、VBチームはこれらのイテレータの機能を完全に完了させるための言い訳にすることができる。
私たちは、まもなく開催されるPDCにおいて、さらなる詳細を聞けると考えている。