利用TaskCompletionSource把非TPL風格的非同步API包裝成TPL風格API
這東西學會時有相見恨晚的感覺,
那時要處理的問題是以前的非同步API是Begin-End風格的,不過這樣寫出來的程式會蠻亂的,
所以在找一個可以把這寫法包裝起來的方式,
結果找到的範例就是TaskCompletionSource。
public Task<EsriShapes.Geometry> DrawRectangle() { var tcs = new TaskCompletionSource<EsriShapes.Geometry>(); MapApplication.Current.Dispatcher.BeginInvoke(() => { var drawObject = CreateDraw(() => { if (!tcs.Task.IsCompleted) tcs.SetCanceled(); }); drawObject.DrawComplete += (sender, args) => { drawObject.IsEnabled = false; tcs.SetResult(args.Geometry.Extent.ToRectangle()); }; drawObject.DrawMode = DrawMode.Rectangle; drawObject.IsEnabled = true; }); return tcs.Task; }