++C++; // 未確認飛行 C ブログ

http://ufcpp.net/

Posts Tagged ‘Async CTP

Async CTP Refresh

leave a comment »

ということで、Async CTP が更新されました。

今回のリフレッシュの大きな変更点は以下の通り。

  • Windows Phone 7 に対応
  • Visual Studio SP1 に対応
  • ライセンスが as-is(ありのままで。自己責任で自由に使える)に
  • 非同期の単体テストサンプル追加
  • 英語版以外の Visual Studio にもインストール可能に

ちなみに、今回、ドキュメントは古いままだったりするので注意。

「(C# Spec) Asynchronous Functions.docx 」は古いまま(VB のも同様)。「(Framework) Task-based Asynchronous Pattern.docx」と「(Dataflow) Introduction to TPL Dataflow.docx」は更新されてる。

以下、細かい変更点。

Awaiter の変更

await の実装に使う Awaiter の規約が変わりました(パフォーマンス向上が目的らしい)。Awaiter の自前実装でもしていない限りは変更の影響受けないはず。


bool BeginAwait(Action)
T EndAwait()


bool IsComplete
void OnComplete(Action)
T Current

これに伴い、内部実装も少し変更。

var task = AnotherTaskAsync();
var awaiter = task.GetAwaiter();
if (!awaiter.IsCompleted)    // タスク未完の場合
{
    state = State1;          // 次に復帰するときのための状態の記録
    awaiter.OnCompleted(a);
    return;                  // いったん処理を切り上げる
}
case State1:                 // 継続時に続きから開始するためのラベル
var y = awaiter.GetResult(); // タスクの結果を受け取り
awaiter = null;              // new: ガベコレ誘発用

IProgress

IProgress インターフェイスの名前空間が System.Threading から System に移動。

あと、System.Threading.EventProgress クラスは System.Progress クラスに変更。

SwitchTo 廃止

SynchronizationContext.SwitchTo と ThreadPool.SwitchTo が廃止されました。

素直に SynchronizationContext.SetSynchronizationContext するか、ConfigurableAwait を利用すべきとのこと。

追加

Socket クラスと Dns クラスに対する非同期メソッド追加。

TaskEx.FromResult (単なる値を Task でラップしてくれる)追加。

DataFlow

細かくは追っていないものの、System.Threading.Tasks.Dataflow.dll の方は結構色々と変更があるみたい。

例外処理

void な非同期メソッド中で起きた例外が、現在の SynchronizationContext に対して Post されるように。

他、いくつかバグフィックスがあったっぽい。

広告

Written by ufcpp

2011年4月13日 at 18:11

カテゴリー: C#

Tagged with ,

Async C#/VB

with one comment

ようやく、C#/VB にも非同期構文が入るようです。

http://msdn.microsoft.com/vstudio/async

  • C#/VB に非同期用の構文が入ります
    • async キーワードで非同期呼び出し開始、await キーワードで計算結果を拾えるっぽい
    • 基本的には Task クラスに対する構文糖衣になる模様
  • あと、VB にイテレーター ブロックが追加
    • しかも、VB は匿名メソッド中でも Yield 書ける
  • バージョンや時期に関しては一切触れられておらず
    • これだけが C# 5.0 でもないってことかな?
    • C# 5.0 ⊃ Async CTP な包含関係?

関連リンク:

Async CTP 以外の情報

Anders Hejlsberg の The Future of C# and Visual Basic では、大部分 Async CTP の話ですけども、最後にちょこっと Compiler as a Service の進捗状況のデモが。

  • デモ失敗してたんで、やっぱりまだまだ安定しえない感じで、いつになる分からない状況
  • Visual Studio との連携されてる
    • 最近ずっと言ってる「DSL 作るなら IDE との連携まで考えないとダメ」ってのが、ちゃんと実現できそうな感じ

あと、この発表を見て、「Reactive Extensions (Rx)はどうなるの?」みたいな話も出てますね。とりあえず、今のところ、

  • 単一の値を非同期にとってきて処理 → async
  • 定常的にやってくる非同期イベントを処理しつづけたい → Rx

という認識でよいかと。こっちはこっちで、以下の動画参照

ちなみに、RX も今日、更新: Release Notes

Async CTP の大まかなイメージ

以下のような非同期メソッドを書いて、

static async void TestAsync()
{
    for (int i = 0; i < 5; i++)
    {
        Console.WriteLine(i);
        await TaskEx.Delay(1000);
        Console.WriteLine("end test");
    }
}

Main メソッドで以下のように書くのと

TestAsync();
Thread.Sleep(5000);
Console.WriteLine("Main 終了");

以下のようなイテレーター + 補助関数を書いて

static void Async(IEnumerable<object> coroutine)
{
    var e = coroutine.GetEnumerator();
    Action a = null;
    a = () =>
    {
        lock(e) if (!e.MoveNext()) return;
        a.BeginInvoke(ar => { a(); }, null);
    };
    a();
}

static IEnumerable<object> Coroutine()
{
    for (int i = 0; i < 5; i++)
    {
        Console.WriteLine(i);
        TaskEx.Delay(1000).Wait();
        yield return null;
    }
    Console.WriteLine("end test");
    yield return null;
}

以下のように呼び出すのが

Async(Coroutine());
Thread.Sleep(5000);
Console.WriteLine("Main 終了");

同じような動作をするイメージ。(あくまでイメージ。これだと例外に対処できてない。)

(あっ、あと、Task の Wait の位置おかしい。yield return の後で Wait しないと。< あとで直す)

  • イテレーターと同じようなノリで結構頑張ってコード生成。
    • await のところでいったん BeginAwait(); return; して処理を止めて、次の MoveNext(相当の呼び出し)のときに EndAwait(); してから再開。
    • こういうアイディアでやってるって話、実は PDC の前日にブログ記事が上がってたり:
  • そのイテレーター的なものを、何度も細切れに、MoveNext が false になるまで非同期呼び出し
  • await できるためには、GetAwaiter メソッドを持っていて、その戻り値(awaiter)が BeginAwait と EndAwait を持ってないとダメ。
    • GetAwaiter は拡張メソッドでも OK っぽい。

構文的には、最近では結構よくみる非同期構文なんですが、

  • 極力フレームワーク(既存の Task クラス)に頼る
  • 拡張メソッドも含めて、規約ベースの構文糖衣
    • LINQ のクエリ式で、 from x in list where x > 0 select x が list.Where(x => x > 0) と解釈されて、Where はインスタンス メソッドでも拡張メソッドでもいいというのと同様

というように、コンパイラーへの負担を最小に抑えているのがポイント。おかげで、以下の通り、仕様書が Word 形式で10ページ(53KB)というコンパクトさ。

Written by ufcpp

2010年10月28日 at 19:42

カテゴリー: .NET, C#

Tagged with , ,