2013-02-01 20 views
5

如果我有一个回调如何使“旧式”异步方法awaitable

MyMethodAsync(<Input Parameters ...>, Callback); 

我怎样才能使它awaitable异步方法?

[此方法对于Windows Phone 7的,但应同样适用于任何类似的C#构造]

DNSEndpoint Endpoint = ... 
NameResolutionCallback Callback = (nrr) => { ... } 
DeviceNetworkInformation.ResolveHostNameAsync(Enpoint, Callback, null); 

我想提出一个awaitable包装解决这个电话,让我等待回调完成然后继续下一个命令。

+2

在便携式类库或.NET 4.5,你可以使用TaskFactory.FromAsync(http://msdn.microsoft.com/en-us/library/dd321469。 aspx) - 我不知道WP7的简单等价物。可能有一个支持库有相同的东西。 –

+2

我以为FromAsync仅适用于定义为BeginXXX,EndXXX对的方法? – Peregrine

+0

有各种FromAsync重载。我可能没有链接到最合适的一个。 –

回答

7

你可以使用一个TaskCompletionSource

var tcs = new TaskCompletionSource<TypeOfCallbackParameter>(); 

MyMethodAsync(..., r => tcs.SetResult(r)); 

return tcs.Task; 
+0

+1。 'TaskCompletionSource '是[正确的方法](http://msdn.microsoft.com/en-us/library/hh873178.aspx)。 –