特集

.NET開発者のためのPDC 2003レポート

吉松 史彰
2003/11/12

Page1 Page2 Page3

非同期実行機能のコンポーネント化

 Whidbeyの.NET Frameworkクラス・ライブラリには、System.ComponentModel.BackgroundWorkerというクラスが追加されている。このクラスは、それが所属する名前空間からも分かるとおり、Visual Studio “Whidbey”においてデザイナ画面にドラッグアンドドロップできるコンポーネントになっている。

 このコンポーネントは、ある種の時間のかかる処理を非同期的に実行する機能を提供する。現在の.NET Frameworkでは、デリゲートの非同期実行機能を使うことで同じことが実現できる。しかし、特にWindowsアプリケーションを開発しているときは、デリゲートの非同期実行機能を使うと、本来無視できるはずのスレッドに関する知識が必要とされる。BackgroundWorkerコンポーネントは、その問題を解消するために作られたといっていいだろう。従って、主な用途はWindowsアプリケーションの開発時に、長時間かかるタスクを実行してもユーザー・インターフェイス(以下UI)がフリーズしないようにすることにあると思われる。

 例えば、現在のVB.NETで次のようなコードを書いてしまうと、ボタンがクリックされたときにアプリケーションが5秒間フリーズしてしまう。

Imports System
Imports System.Windows.Forms

class Form1 : Inherits Form
  Private WithEvents Button1 As Button
  Public Sub New()
    Button1 = New Button()
    Controls.Add(Button1)
  End Sub

  Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim i As Integer = 1
    Threading.Thread.Sleep(5 * 1000)
    i += 1
    Text = i.ToString()
  End Sub

  <STAThread> _
  Shared Sub Main()
    Application.Run(New Form1())
  End Sub
End Class
UIがフリーズしてしまうWindowsアプリケーションの例
ボタンがクリックされたときには、Sleepメソッドの呼び出しにより5秒間ウィンドウは固まったままとなる。つまり、時間のかかる処理をそのまま記述してしまうと、反応の悪いアプリケーションができてしまう。このような場合、現在の.NET Frameworkでは、マルチ・スレッドを利用したデリゲートの非同期実行機能を使う必要がある。

 WhidbeyのBackgroundWorkerクラスを利用すれば、次のようにコードを書き換えることで、時間がかかる処理を行っていても、ウィンドウを自由に移動させることができる。

Imports System
Imports System.ComponentModel
Imports System.Windows.Forms

class Form1 : Inherits Form
  Private WithEvents BackgroundWorker1 As BackgroundWorker
  Private WithEvents Button1 As Button
 
  Public Sub New()
    Button1 = New Button()
    BackgroundWorker1 = New BackgroundWorker()
    Controls.Add(Button1)
  End Sub
 
  Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim i As Integer = 1
    BackgroundWorker1.RunWorkerAsync(i)
  End Sub
 
  <STAThread> _
  Shared Sub Main()
    Application.Run(New Form1())
  End Sub
 
  Private Sub BackgroundWorker1_DoWork(sender As Object, e As DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    Dim i As Integer = CInt(e.Argument)
    Threading.Thread.Sleep(5 * 1000)
    e.Result = i + 1
  End Sub
 
  Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
    Text = e.Result.ToString()
  End Sub
End Class
WhidbeyのBackgroundWorkerクラスの使用例
BackgroundWorkerクラスでは、RunWorkerAsyncメソッドにより時間のかかる処理を非同期に開始できる。処理が完了した場合にはRunWorkerCompletedイベントが発生する。マルチ・スレッドを意識する必要はない。
Windowsアプリケーションのスレッディング・モデルを熟知している読者には、このコードにはバグが潜んでいるように見えるかもしれない。だが、その心配は無用である。BackgroundWorker1_RunWorkerCompletedメソッドは、UIスレッド上で実行される。

Visual Basic .NETの新機能

 VB.NETでは次のような機能が新たにサポートされる。

  • 演算子オーバーロード

  • 符号なし型

  • 配列の添え字の明示
    記述例:
      Dim x(1 To 100) As String

  • Usingステートメント

  • ループ内部でのContinueステートメント

  • IsNot演算子

  • プロパティに対するアクセッサ・メソッドへのアクセス修飾子を別々に定義可能
    記述例:
      Property Name As String
        Get
          Return name
        End Get
        Private Set(value As String)
          name = value
        End Set
      End Property

  • XMLコメント

  • Globalキーワード
     名前空間の検索をルートから始めるためのキーワード。

C#の新機能

 C#には次のような機能が追加される。

  • Iterator(イテレータ)
     foreach構文に対応するクラスを定義しやすくする。

    class Data {
      System.Collections.Generic.List<int> elements;

      internal Data() {
        elements = new System.Collections.Generic.List<int>(3);
        elements.Add(1);
        elements.Add(2);
        elements.Add(3);
      }
      public IEnumerator GetEnumerator() {
        for (int i = 0; i < elements.Count; i++) {
          yield elements[i];
        }
      }
    }
    C#の新機能Iteratorの記述例
    新しいyieldキーワードにより、foreach構文に対して値を返すことができ、繰り返しの状態をプログラムで維持する必要がなくなる。

  • Anonymousメソッド
     デリゲートに対応するメソッドを、デリゲートを作成するコードに記述してしまう機能。
    記述例:
      button1.Click
            += delegate { MessageBox.Show("I am anonymous."); };

新機能:MSBuild.exe

 従来のVisual Studio製品や現在のVisual Studio .NETでは、ソリューションやプロジェクトの役割は、ある意味コンパイラに渡すためのファイルをまとめて格納するフォルダにすぎない。1つのプロジェクトに必要なファイルをまとめて入れておいて、エイヤでコンパイラに渡して実行可能ファイルを作るための方便だったといっていいだろう。しかし、最近の開発シーンでは、「エイヤ」ではダメな場合が出てきた。

- アジャイル開発プロセスの普及

  • 特にテスト・ファーストやユニット・テストの自動化の考え方が普及するにつれ、単なるコンパイルだけを行うツールでは力不足になってきた。

- 大規模開発プロジェクトへの対応

  • Windowsの開発のような大規模プロジェクトになると、コードを書く人間と書かれたコードをビルドして結合する人間とは異なることの方が多い。コードを書く人間にとって重要な機能と、ビルド・ラボで働く人間にとって重要な機能は異なる。Visual Studio .NETのプロジェクトはコードを書くための人間にとっては利用しやすいが、結合テストの担当者にとっては使いづらい。

 これらの要件を満たすため、Whidbeyには新しく「MSBuild」というビルド・エンジンが提供される。MSBuildを使えば、XML 1.0で記述されたテキスト・ベースのプロジェクト・ファイルを元に、コンパイル、ユニット・テスト、配布などの、開発フェイズのすべての側面で必要な作業を自動実行できる。Javaベースの開発ではおなじみになりつつある、Jakartaプロジェクトの「Ant」の.NET版ということができるだろう。

 Visual Studio “Whidbey”で作成するプロジェクト・ファイルは、MSBuild.exeへのインプットになるように記述される。MSBuildに対応するプロジェクト・ファイルは単なるテキスト・ファイルなので、メモ帳で記述することももちろん可能だ。

まとめ

 Whidbeyは未だアルファ版という段階である。.NET Frameworkが初めて世に出たときのことを考えれば、今回紹介した新機能のほかに追加される機能があったり、逆に削られてしまう機能があったりすることも十分に予測できる。だが、WhidbeyでMicrosoftが目指す方向、つまり、

『 Do more with less code and less click 』
 ― より少ないコード量、より少ないクリック(作業)で多くのことを実現する

が変わることはないだろう。ASP.NETやADO.NETを含む、.NET Frameworkクラス・ライブラリにも多数の新しいクラスが定義されているが、そのほとんどの機能は、現在は開発者が書いているコードをMicrosoftが書いてクラス・ライブラリに含めてしまうということにほかならない。

 また、Partial TypesやMSBuild.exeの機能に象徴されるような、Longhorn時代へ向かう準備という流れも無視することはできないだろう。今回のPDCでは、Longhornに対するAPIは完全にマネージ・コード(共通言語ランタイム上で動作するコード)に移行することが発表されている。いまはまだ、Windowsが持っているもののうち.NET Frameworkクラス・ライブラリからはアクセスできない機能が多々存在するが、LonghornとWinFX(.NET Frameworkの次期名称)が公開されれば、Win32 APIは過去のものになり、アンマネージ・コードを記述する必要はほとんどなくなってしまうだろう。その流れに備えるために、いまから.NET Framework上での開発を始めることは決して早すぎる決断ではない。

 今年のPDCは前回(2001年)のPDCとは正反対に、ASP.NETやADO.NETの新版(といっても機能追加だが)など、ここで紹介したもの以外にも非常に多くのトピックが詰め込まれており、その内容を少ない紙面(画面?)で一口に解説するのは非常に難しい。幸い日本では、PDCで解説された内容をローカライズして行うデベロッパー向けイベント「.NET Developers Conference 2003」が12月に予定されている*1。このようなイベントが計画されているのは日本だけであり、ヨーロッパ、中国、シンガポール、韓国などですら開催されない。日本に住む読者にとっては、PDCで配布されたプレビュー版を目にし、手にするチャンスである。ロサンゼルスでの興奮がお台場では日本語吹き替えで再現されることになるだろう。End of Article

*1 2003/11/11現在、すでに参加登録が定員に達してしまい、キャンセル待ち登録のみとなっている。
 
 

 INDEX
  [特集].NET開発者のためのPDC 2003レポート
     1.PDC 2003で明らかになったこと
     2.Whidbeyの新機能(1)
   3.Whidbeyの新機能(2)
 


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間