2013-10-19 23 views
5

Ich arbeite an einer neuen Windows Phone 8 App. Ich verbinde mich mit einem Webservice, der gültige JSON-Daten zurückgibt. Ich benutze Longlistselector, um die Daten anzuzeigen. Das funktioniert gut, wenn ich den String json in GetAccountList() verwende; aber wenn ich Daten von der DataServices-Klasse erhalte, bekomme ich den Fehler "Kann den Typ 'System.Threading.Tasks.Task'to String nicht implizit konvertieren". Ich weiß nicht, was schief läuft. Jede Hilfe ist willkommen. Vielen Dank!Umgang mit Daten von 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; 
    } 

UPDATE: habe ich es leicht und funktioniert nun wie ein Zauber. Danke für Ihre Hilfe! 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; 
    } 

Antwort

1

Diese Linie ist Ihr Problem:

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

Haben Sie das versuchen? :

return responseBody; 

dies versuchen:

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

Immer noch das Gleiche. Es gibt den Fehler an "Zeichenfolge json = DataService.GetResquest (url); "in GetAccountList() – marlonlaan

+0

Ja, es gibt den Fehler dort, wegen Async. Aber bitte nehmen Sie einen Breakpoint in die GetReuquest-Methode und sagen, wo ist die 'Wirklich' Ausnahme Thronw :) – Krekkon

+0

Kann nicht kompilieren mit Unterbrechungspunkt http://cuse.nl/Naamloos.jpg – marlonlaan

0

Ein paar Dinge hier. Zuerst wird der Fehler

kann nicht implizit Typ ‚System.Threading.Tasks.Task‘ string Dieser Fehler kommt aus dem Aufruf von DataService.GetRequest(url) konvertieren. Diese Methode gibt eine Zeichenfolge zurück. Tt gibt Task zurück, wobei T eine Zeichenkette ist. Es gibt viele Möglichkeiten, wie Sie das Ergebnis dieser Methode verwenden können. Der erste (und der beste/neueste) ist der Aufruf der Methode abzuwarten. Dies ist die neue async/erwarten Muster

string json = await DataService.GetResult(url); 

Diese Änderung erfordert, dass Sie die async Tastatur auf Ihre Methode

public async static List<AccountModel> GetAccountList() 

hinzuzufügen. Das Hinzufügen dieser Wörter teilt dem Compiler mit, dass die Methode cal asynchron ist. Sie können asynchrone Aufrufe durchführen, aber Code so schreiben, als wäre er synchron. Die anderen Methoden zum Aufrufen der Methode bestehen darin, das Task-Objekt direkt zu bearbeiten.

// 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. 
}; 

Jetzt für die GetResult-Methode. Um das async/await-Muster zu verwenden, müssen Sie Task aus Methoden zurückgeben. Auch wenn der Rückgabetyp Aufgabe ist, sollte Ihr Code T. zurückkehren So wie Krekkon erwähnt, sollten Sie die Rückleitung zu

return responseBody; 

Hier ist über die Rückkehr Aufgabe von einem Asynchron-Methode eine great article ändern.