簡體   English   中英

如何在沒有基於任務的代理的情況下處理Windows Phone 8中的服務引用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM