![](/img/trans.png)
[英]Windows Service Job Monitor via Touch of Task-based Asynchronous Pattern (TAP)
[英]How to handle Service References in Windows Phone 8 without Task-Based proxies
如此強調基於任務的異步開發,我驚訝地發現Windows Phone 8中的服務引用不支持基於任務的實現。 而是使用基於事件的“ XYZCompleted”異步方法。
結果,像這樣的代碼是必需的: http : //codepaste.net/fqyt47
public async Task<IEnumerable<MyService.Character>> GetCharactersAsync()
{
var _Task = new TaskCompletionSource<IEnumerable<MyService.Character>>();
var _Client = new MyService.ServiceClient();
_Client.GetCharactersCompleted += (s, e) =>
{
var _Characters = e.Result as IEnumerable<MyService.Character>;
if (e.Error != null && !_Task.TrySetException(e.Error))
System.Diagnostics.Debugger.Break();
else if (e.Cancelled && !_Task.TrySetCanceled())
System.Diagnostics.Debugger.Break();
else if (!_Task.TrySetResult(_Characters))
System.Diagnostics.Debugger.Break();
};
_Client.GetCharactersAsync();
return await _Task.Task;
}
但是, 這感覺不對 。 有沒有更好,更優雅的方法?
我很驚訝Windows Phone 8沒有基於Task
的參考創建。
也就是說, TaskCompletionSource
是與各種異步模式(包括EAP)進行互操作的標准方法 。
通常,它是通過擴展方法來完成的,這些擴展方法可以由await
消耗,但是它們本身並不async
:
public Task<IEnumerable<MyService.Character>> GetCharactersTaskAsync(this ServiceClient client)
{
var tcs = new TaskCompletionSource<IEnumerable<MyService.Character>>();
client.GetCharactersCompleted += (s, e) =>
{
if (e.Error != null) tcs.SetException(e.Error);
else if (e.Cancelled) tcs.SetCanceled();
else tcs.SetResult(e.Result);
};
client.GetCharactersAsync();
return tcs.Task;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.