Menu


C# 5の非同期、パート1

原文

C# 2.0のデザイナーは、反復子のロジックを書くことがつらいと気づいた。それで、彼らは反復子ブロックを追加した。そうして、コンパイラは継続――「次に来ること」――をどこかの状態に、舞台裏に隠しながら保存できるステート・マシンをどのように造るべきかについてわかることができた。そのため、あなたはそのコードを書く必要はない。

彼らはまた、ローカル変数を利用する小さなメソッドを記述することもつらいと気づいた。それで、彼らは匿名メソッドを追加した。そうして、コンパイラはクロージャ・クラスにローカル変数をどのように渡すべきかについてわかることができた。そのため、あなたはそのコードを書く必要はない。

C# 3.0のデザイナーは、複雑なデータセットをソートして、フィルタリングして、結合して、グループ化して、集約するコードを書くことがつらいと気づいた。それで、彼らはクエリ内包と残りのLINQ機能の全てを追加した。そうして、コンパイラはクエリ、式木、その他を造るためにどのように正しいオブジェクトモデルを呼ぶべきかについてわかることができた。

C# 4.0のデザイナーは、レガシーな動的オブジェクト・モデルと最新のものとを相互運用することがつらいと気づいた。それで、彼らはdynamic型を加えた。そうして、コンパイラは実行時にDynamic Language Runtimeの分析をするコードをどのようにコンパイル時で生み出すべきかについてわかることができた。

C# 5.0のデザイナーは、非同期コードを書くことがつらいと気づいた。どのように多くの方法であっても。非同期コードは推論するのが難しく、我々が見たように、継続への変化は複雑で、コードの意味を不明瞭にするメカニズムで充満したコードにつながる。

これを我慢してはいけない。

C# 5.0(*)をお知らせしよう。C# 5.0では、あなたがこの同期のコードを受け取り:

void ArchiveDocuments(List<Url> urls)
{
  for(int i = 0; i < urls.Count; ++i)
    Archive(Fetch(urls[i]));
}

そして、FetchAsyncとArchiveAsyncメソッドの理にかなった実装を与えられて、昨日説明したように、あなたは待ち時間を共有するゴールを達成するためにそれをこのコードに変えることができる:

async void ArchiveDocuments(List<Url> urls)
{
  Task archive = null;
  for(int i = 0; i < urls.Count; ++i)
  {
    var document = await FetchAsync(urls[i]);
    if (archive != null)
      await archive;
    archive = ArchiveAsync(document);
  }
}

いったいどこに、ステート・マシンのコードや、ラムダや、継続や、タスクがすでに完了しているかどうか見るチェックがあるのか?それらはすべて、まだそこにいる。反復子ブロックや、クロージャや、式木や、クエリ内包や、ダイナミックな呼び出しのコードをコンパイラに生成させたのとまさに同じように、あなたのためにそれら全てのものをコンパイラに生み出させよう。上のC# 5.0コードは、基本的に、私が昨日説明したコードのための構文糖である。それは、かなり甘い砂糖である!

私は、この点について全くはっきりしたい:上のコードのアクションは、昨日のコードのアクションと論理的に同じである。タスクが「await(待たれる)」のときはいつでも、現在のメソッドの残りはタスクの継続として登録される、それから、制御はすぐに呼び出し側に復帰する。タスクが完了するとき、継続は呼び出される、そして、メソッドはそれが前にあったところを始める。

私が本稿をポストする時間を正しく計ったならば、AndersはPDCでこの新しい言語機能を発表している。ちょうど……今頃。あなたは、それをここで見ることができる。

我々は、まさに今から、プロトタイプC# 5.0コンパイラのCommunity Technology Preview版を利用できるようにする。プロトタイプ・コンパイラは、プロトタイプ品質である;機能がまだ不安定でラフであると思っていなさい。狙いは、あなたにそれをためす機会を与えて、あなたが何を考えるかについて見ることで我々が早めのフィードバックを得ることができるようにすることだ。

私は明日、そしてその後も相当な時間、この機能についてより多くをポストしている;あなたが待つことができないか、プロトタイプを手にしたくなるならば、あなたはmsdn.com/vstudio/asyncから多くの詳細な情報と新しくておいしいコンパイラ・ビットを得ることができる。

そして、もちろん我々の共進化戦略に合わせてVisual Basic 11があり、それもタスク・ベースの非同期を特徴とする。詳細はVBチーム・ブログをチェックするか、さもなければ、私の同僚であるLucianのブログでこの機能についてすべてを読むこと。(Lucianは、C#とVBの両方で、この機能のデザインとプロトタイピングの多くをした;これの専門家は私ではなく彼なので、あなたが深い質問を持っているならば、あなたは私でなく彼に質問したいかもしれない。)

明日:await?async?Task?AsyncThingy<T>はどうなった?もっと教えろ!

(*) 今の時点で我々は日付や出荷手段を少しも全く明らかに発表していない。だから質問したりしないこと。たとえ私が知っていたとしても、とは言っても私は知らないし、そしてたとえその知識が正確である可能性がかすかにあったとしても、とは言ってもその可能性はないのだが、私はまだあなた達に話さない。


インデックスへ戻る


Last Update: 2012-09-26 09:35:04