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

http://ufcpp.net/

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日 @ 18:11

カテゴリー: C#

Tagged with ,

コメントを残す