非同期に対応してないレガシーAPI
非同期に対応していない古いAPIは今どき困りものである。しかし.NETは簡単に非同期機能を追加できる便利な機構を持っている。拡張メソッドとTaskCompletionSourceクラスである。サンプル的な使い方はこんな感じ。
非同期に対応してないレガシーAPIを非同期に対応したモダンAPIに変えるサンプル
classProgram{staticasyncTaskMain(string[]args){varoao=newOldApiObject();vara=awaitoao.DoAsync(true);}}staticclassOldApiEx{publicstaticasyncTask<bool>DoAsync(thisOldApiObjectoao,boolflag){varcs=newTaskCompletionSource<bool>();oao.Done+=result=>cs.SetResult(result);oao.Do(flag);//この時点でcs.Task.IsCompletedはTruereturnawaitcs.Task;}}classOldApiObject{publiceventOldEventHandlerDone;publicdelegatevoidOldEventHandler(boolflag);publicvoidDo(boolflag){Done(flag);}}
OldApiObjectが古いAPIである。DoneイベントとDoメソッドが用意されている。新たにOldApiExクラスを作成する。OldApiObjectに対して拡張メソッドを提供する。これにより使う側は古い新しいを意識せずに非同期機能を使うことができる。
今後、もうちょっとサンプルとか解説用意するかも