2012-11-01 34 views
5

Có hỗ trợ mẫu async/await trong WP8 không?Async đang chờ trong API truy cập web Windows Phone

Tôi cần nhận XML từ API dựa trên web và có vẻ như WebClient hoặc WebRequest không hỗ trợ nó.

Có các lớp học nào hỗ trợ async/await có thể sử dụng để truy cập web trong WP8 BCL không? Và nếu không, có thư viện nào tôi có thể sử dụng không?

Tôi biết không khó để tạo trình bao bọc để hỗ trợ nó, nhưng điều này có vẻ giống như một thứ sẽ được đưa vào SDK.

Trả lời

16

Có các lớp học nào hỗ trợ async/await có thể sử dụng để truy cập web trong WP8 BCL không?

Đây là mối quan tâm đã được nêu ra trong phiên bản beta đóng của SDK WP8, vì vậy tôi có thể trả lời thật không may là không.

Nhưng như bạn đã đề cập, thật dễ dàng để tạo các trình bao bọc của riêng bạn.

Ví dụ:

public static class Extensions 
{ 
    public static Task<string> DownloadStringTask(this WebClient webClient, Uri uri) 
    { 
     var tcs = new TaskCompletionSource<string>(); 

     webClient.DownloadStringCompleted += (s, e) => 
     { 
      if (e.Error != null) 
      { 
       tcs.SetException(e.Error); 
      } 
      else 
      { 
       tcs.SetResult(e.Result); 
      } 
     }; 

     webClient.DownloadStringAsync(uri); 

     return tcs.Task; 
    } 
} 
+0

tại sao bạn sẽ đặt hoạt động async trong chủ đề riêng của mình? Tôi không biết tại sao, nhưng điều này có vẻ khủng khiếp! –

+0

Chỉ cần xóa Task.Factory.StartNew ... –

+1

@ToniPetrina Bạn nói đúng, cảm ơn. Đã sửa. –

0

Có hỗ trợ cho các async/chờ đợi mẫu trong WP8?

Chỉ cần làm rõ, có đầy đủ hỗ trợ C# 5.0 trên Windows Phone 8. API WinRT phụ thuộc phần lớn vào async/await, chẳng hạn như đồng bộ hóa với PeopleHub hoặc sử dụng API I/O.

Tuy nhiên, API Silverlight và cũ .NET chưa được cập nhật để sử dụng async/await cho các lớp như WebClient.

+0

Tôi nhận được rằng có hỗ trợ ngôn ngữ, nhưng KooKiz khẳng định, không có hỗ trợ API. –

+0

Nếu bạn đọc toàn bộ bài đăng * của tôi, bạn sẽ thấy rằng có * là * hỗ trợ API, cho * một số * API. –

8

Có một số hỗ trợ cho WP8 trong số Microsoft.Threading.Tasks.Extensions.Phone.dll được cung cấp dưới dạng một phần của Microsoft.Bcl.Async NuGet package được mô tả in this blog post.

Cụ thể, nó bao gồm WebClient.DownloadStringTaskAsync.

0

WP8 có hỗ trợ async/await bản địa với một số hạn chế, như thiếu HttpClient và có thể các lớp khác.
WP7 đã hỗ trợ cho async/chờ đợi trong VS2010 sử dụng AsyncCTP, nhưng trong VS2012 nó đã được tái gia tăng thời gian gần đây như Microsoft.Bcl.Async:
https://nuget.org/packages/Microsoft.Bcl.Async/1.0.12-beta

1

tôi đã cùng một vấn đề và tôi thấy điều này và giúp tôi

private async Task<T> ExecuteAsync<T>(RestRequest request) 
    { 
     var tcs = new TaskCompletionSource<T>(); 
     _client.ExecuteAsync(request, resp => 
     { 
      var value = JsonConvert.DeserializeObject<T>(resp.Content); 
      if (value.ErrorCode > 0) 
      { 
       var ex = new ToodledoException(value.ErrorCode, value.ErrorDesc); 
       tcs.SetException(ex); 
      } 
      else 
       tcs.SetResult(value); 
     }); 
     return await tcs.Task; 
    } 

http://www.developer.nokia.com/Community/Wiki/Asynchronous_Programming_For_Windows_Phone_8 cũng tôi thấy phần mở rộng này hữu ích http://nuget.org/packages/WP8AsyncWebClient/

Các vấn đề liên quan