BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース のぞき見: Visual BasicとC#の非同期シンタックス

のぞき見: Visual BasicとC#の非同期シンタックス

ブックマーク

原文(投稿日:2010/10/28)へのリンク

最近ポストされて、その後削除された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において、さらなる詳細を聞けると考えている。

この記事に星をつける

おすすめ度
スタイル

BT