2013-10-19 28 views
5

'daki veriler nasıl işlenir Yeni bir Windows Phone 8 uygulaması üzerinde çalışıyorum. Geçerli json verilerini döndüren bir web servisine bağlanıyorum. Verileri görüntülemek için longlistselector kullanıyorum. GetAccountList() içinde dize json kullanırken bu iyi çalışır. ancak DataServices sınıfından veri alırken hata alıyorum "Implicitly 'System.Threading.Tasks.Task'to string" türünü dönüştüremiyor. Neyin yanlış gittiğini bilmiyorum. Herhangi bir yardım edilir. Teşekkürler!httpclient

DataServices.cs

public async static Task<string> GetRequest(string url) 
    { 
     HttpClient httpClient = new HttpClient(); 

     await Task.Delay(250); 

     HttpResponseMessage response = await httpClient.GetAsync(url); 
     response.EnsureSuccessStatusCode(); 
     string responseBody = await response.Content.ReadAsStringAsync(); 
     Debug.WriteLine(responseBody); 
     return await Task.Run(() => responseBody); 
    } 

AccountViewModel.cs

public static List<AccountModel> GetAccountList() 
    { 
     string json = DataService.GetRequest(url); 
     //string json = @"{'accounts': [{'id': 1,'created': '2013-10-03T16:17:13+0200','name': 'account1 - test'},{'id': 2,'created': '2013-10-03T16:18:08+0200','name': 'account2'},{'id': 3,'created': '2013-10-04T13:23:23+0200','name': 'account3'}]}"; 
     List<AccountModel> accountList = new List<AccountModel>(); 

     var deserialized = JsonConvert.DeserializeObject<IDictionary<string, JArray>>(json); 

     JArray recordList = deserialized["accounts"]; 


     foreach (JObject record in recordList) 
     { 
      accountList.Add(new AccountModel(record["name"].ToString(), record["id"].ToString())); 
     } 

     return accountList; 
    } 

GÜNCELLEME: Ben küçük bir değişiklik yapmış ve şimdi bir cazibe gibi çalışır. Yardım ettiğin için teşekkür ederim! DataServices.cs

 //GET REQUEST 
    public async static Task<string> GetAsync(string url) 
    { 
     var httpClient = new HttpClient(); 

     var response = await httpClient.GetAsync(url); 

     string content = await response.Content.ReadAsStringAsync(); 

     return content; 
    } 

AccountViewModel.cs

public async void LoadData() 
    { 
     this.Json = await DataService.GetAsync(url); 
     this.Accounts = GetAccounts(Json); 
     this.AccountList = GetAccountList(Accounts); 
     this.IsDataLoaded = true; 
    } 

    public static IList<AccountModel> GetAccounts(string json) 
    { 
     dynamic context = JObject.Parse(json); 

     JArray deserialized = (JArray)JsonConvert.DeserializeObject(context.results.ToString()); 

     IList<AccountModel> accounts = deserialized.ToObject<IList<AccountModel>>(); 

     return accounts; 
    } 

    public static List<AlphaKeyGroup<AccountModel>> GetAccountList(IList<AccountModel> Accounts) 
    { 
     List<AlphaKeyGroup<AccountModel>> accountList = AlphaKeyGroup<AccountModel>.CreateGroups(Accounts, 
       System.Threading.Thread.CurrentThread.CurrentUICulture, 
       (AccountModel s) => { return s.Name; }, true); 

     return accountList; 
    } 

cevap

1

Bu çizgi, derdin:

return await Task.Run(() => responseBody); 

Bunu

denediniz mi? :

return responseBody; 

de bu deneyin:

public async static List<AccountModel> GetAccountList() 
{ 
    string json = await DataService.GetRequest(url); 
    ... 
} 
+0

Yine aynı. "String json = DataService" hatası verir.GetRequest (url); "GetAccountList() içinde – marlonlaan

+0

Evet, burada hata verir, uyumsuzluğun sebebi. Ama lütfen GetReuquest yöntemine bir kesme noktası girin ve 'Gerçekten' istisnasının nerede olduğunu söyleyin :) – Krekkon

+0

Derlenemiyor breakpoint ile http://cuse.nl/Naamloos.jpg – marlonlaan

0

bir kaç şey burada. İlk örtülü dize Bu hata tip 'System.Threading.Tasks.Task' dönüştürülemez hata

DataService.GetRequest(url) çağrısına geliyor. Bu yöntem bir dizge döndürür. Tt, Task değerini döndürür, burada T bir dizedir. Bu yöntemin sonucunu kullanmanın birçok yolu vardır. İlk (ve en iyi/en yeni) yöntemi çağrıya beklemek. Bu değişikliği yapmak

string json = await DataService.GetResult(url); 

yönteminiz

public async static List<AccountModel> GetAccountList() 

Bu/desen yeni zaman uyumsuz bekliyor olduğu async klavyeyi eklemenizi gerektirir. Bu sözcükleri eklemek, derleyiciye yöntemin cal'ın eşzamansız olduğunu bildirir. Eşzamansız arama yapmanıza, ancak senkronize edilmiş gibi kod yazmanıza izin verir. Yöntemi çağırmanın diğer yolları, Görev nesnesini doğrudan çalışmaktır.

// First is to use the Result property of the Task 
// This is not recommended as it makes the call synchronous, and ties up the UI thread 
string json = DataService.GetResult(url).Result; 

// Next is to continue work after the Task completes. 
DataService.GetResult(url).ContinueWith(t => 
{ 
    string json = t.Result; 
    // other code here. 
}; 

Şimdi GetResult yöntemi için. Async/await düzenini kullanmak, Görevleri yöntemlerden döndürmenizi gerektirir. Dönüş türü Görev olsa Krekkon söylediği gibi, başka bir zaman uyumsuz yönteminden Görevi dönen hakkında great article İşte

return responseBody; 

dönüş hattını değiştirmektir gerektiğini Yani, kod T. dönmelidir.