2013-10-19 20 views
5

से डेटा को कैसे प्रबंधित करें मैं एक नए विंडोज फोन 8 ऐप पर काम कर रहा हूं। मैं एक webservice से कनेक्ट कर रहा हूं जो वैध जेसन डेटा देता है। मैं डेटा प्रदर्शित करने के लिए longlistselector का उपयोग कर रहा हूँ। यह ठीक काम करता है जब मैं GetAccountList() में स्ट्रिंग जेसन का उपयोग कर रहा हूं; लेकिन डेटा सर्विसेज क्लास से डेटा प्राप्त करते समय मुझे त्रुटि मिल रही है "टाइप को पूरी तरह से परिवर्तित नहीं किया जा सकता" सिस्टम। थ्रेडिंग। टास्क। स्ट्रिंग टू स्ट्रिंग "। पता नहीं क्या गलत हो जाता है। किसी भी मदद का स्वागत है। धन्यवाद!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; 
    } 

अद्यतन: मैं इसे हल्के से बदल दिया है और एक आकर्षण की तरह अब काम करता है। आपकी सहायताके लिए धन्यवाद! 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; 
    } 

उत्तर

1

कि लाइन तुम्हारी समस्या क्या है:

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

आपको लगता है कि कोशिश की? : यहाँ

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

फिर भी वही। यह "स्ट्रिंग जेसन = डेटा सेवा" पर त्रुटि देता है।GetRequest (url); "GetAccountList() – marlonlaan

+0

हां, यह एसिंक के कारण त्रुटि देगा, लेकिन कृपया GetReuquest विधि में ब्रेकपॉइंट लें और बताएं, 'वास्तव में' अपवाद कहां था ... – Krekkon

+0

संकलित नहीं कर सकता ब्रेकपॉइंट के साथ। http://cuse.nl/Naamloos.jpg – marlonlaan

0

कुछ बातें:

return responseBody; 

यह भी प्रयास करें। सबसे पहले त्रुटि

परोक्ष स्ट्रिंग यह त्रुटि के प्रकार 'System.Threading.Tasks.Task' कनवर्ट नहीं कर सकता DataService.GetRequest(url) करने के लिए कॉल से आ रही है। यह विधि एक स्ट्रिंग वापस करता है। टीटी Task देता है जहां टी एक स्ट्रिंग है। इस विधि के परिणाम का उपयोग करने के कई तरीके हैं। पहला (और सबसे अच्छा/नवीनतम) विधि को कॉल का इंतजार करना है।

string json = await DataService.GetResult(url); 

यह परिवर्तन करने के लिए अपने विधि

public async static List<AccountModel> GetAccountList() 

इस नए async/का इंतजार कर रहा है पैटर्न के लिए async कुंजीपटल जोड़ने की आवश्यकता है। इन शब्दों को जोड़ना संकलक को बताता है कि विधि कैल असीमित है। यह आपको एसिंक्रोनस कॉल करने की अनुमति देता है लेकिन कोड लिखता है जैसे कि यह तुल्यकालिक है। विधि को कॉल करने के अन्य तरीके कार्य वस्तु को सीधे कार्य करना है।

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

अब GetResult विधि के लिए। एसिंक/प्रतीक्षा पैटर्न का उपयोग करने के लिए आपको विधियों से कार्य वापस करने की आवश्यकता होती है। हालांकि वापसी प्रकार कार्य है, अपने कोड टी लौट तो जैसा कि Krekkon उल्लेख किया है, आप वापसी लाइन

return responseBody; 

के लिए एक async विधि से कार्य लौटने के बारे में बदलना चाहिए यहाँ है एक great article चाहिए।