好用的TaskCompletionSource

  • 193
  • 0
  • 2016-02-16

利用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;	
}