Async CTP Refresh
ということで、Async CTP が更新されました。
- Refreshing the Async CTP
- Visual Studio Asynchronous Programming
- Visual Studio Async CTP (SP1 Refresh)
今回のリフレッシュの大きな変更点は以下の通り。
- 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 されるように。
他、いくつかバグフィックスがあったっぽい。
コメントを残す