BT

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

| 作者: Jonathan Allen フォローする 596 人のフォロワー , 翻訳者 尾崎 義尚 フォローする 0 人のフォロワー 投稿日 2010年11月1日. 推定読書時間: 5 分 |

原文(投稿日: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において、さらなる詳細を聞けると考えている。

この記事に星をつける

おすすめ度
スタイル

こんにちは

コメントするには InfoQアカウントの登録 または が必要です。InfoQ に登録するとさまざまなことができます。

アカウント登録をしてInfoQをお楽しみください。

あなたの意見をお聞かせください。

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

このスレッドのメッセージについてEmailでリプライする
コミュニティコメント

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

このスレッドのメッセージについてEmailでリプライする

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

このスレッドのメッセージについてEmailでリプライする

ディスカッション

InfoQにログインし新機能を利用する


パスワードを忘れた方はこちらへ

Follow

お気に入りのトピックや著者をフォローする

業界やサイト内で一番重要な見出しを閲覧する

Like

より多いシグナル、より少ないノイズ

お気に入りのトピックと著者を選択して自分のフィードを作る

Notifications

最新情報をすぐ手に入れるようにしよう

通知設定をして、お気に入りコンテンツを見逃さないようにしよう!

BT