如何在Windows 10

问题描述:

提取返回任务数据的异步方法在C#中如何提取下面foreach循环从​​返回值的数据: 我在这里无法提取返回值的数据。 我正在Windows 10通用应用程序开发中构建一个应用程序。如何在Windows 10

var response = NetworkingCalls.getResponseFromUrl(url, requestDictionary); 

foreach (KeyValuePair<string, object> item in response) 
{    
    Util.debugLog(item.Key.ToString(), item.Value.ToString()); 
} 

这是返回字典

using System; 
using System.Collections.Generic; 
using System.Threading.Tasks; 
using Windows.Storage.Streams; 
using Windows.Web.Http; 

namespace App2.WrittenLibraries 
{ 
    class NetworkingCalls 
    { 
     public async static Task<Dictionary<string, object>> getResponseFromUrl(string urlString, Dictionary<string, object> requestDictionary) 
     { 
      var client = new HttpClient(); 
      Uri url = new Uri(urlString); 
      var requestToSend = JSONParser.getJsonString(requestDictionary); 
      HttpResponseMessage response = await client.PostAsync(url, new HttpStringContent(requestToSend, 
                          UnicodeEncoding.Utf8, 
                          "application/json")); 
      if (response.IsSuccessStatusCode) 
      { 
       try 
       { 
        var responseString = await response.Content.ReadAsStringAsync();  
        client.Dispose(); 
        return JSONParser.getDictionary(responseString); 
       } 
       catch (Exception ex) 
       { 
        client.Dispose(); 
        return new Dictionary<string, object>(); 
       } 
      } 
      else 
      { 
       client.Dispose(); 
       return new Dictionary<string, object>(); 
      } 
     } 
    } 
} 
+0

请不要永远不要'catch(Exception ex)' - 这是一个糟糕的编程习惯。 – Enigmativity

+0

感谢您的建议,如果您提出其他好的方法,我会更有帮助。 – djkp

+0

@javvajikiran - 简单地不抓住'Exception' - 只捕获您可能发生的可以从中恢复的特定异常。否则,不要抓住他们。你的代码目前隐藏了错误,使你的代码错误并且很难修复。 – Enigmativity

您需要await任务在async方法型号代码:

async Task FooAsync() 
{ 
    var response = await NetworkingCalls.getResponseFromUrl(url, requestDictionary); 

    foreach (KeyValuePair<string, object> item in response) 
    {    
     Util.debugLog(item.Key.ToString(), item.Value.ToString()); 
    } 
} 

如果你方法不能async你可以用task.Resulttask.GetAwaiter().GetResult()得到结果,但这应该是最后的手段,因为它阻止了呼叫线程同步而不是异步等待:

void Foo() 
{ 
    var response = NetworkingCalls. 
     getResponseFromUrl(url, requestDictionary). 
     GetAwaiter(). 
     GetResult(); 

    foreach (KeyValuePair<string, object> item in response) 
    {    
     Util.debugLog(item.Key.ToString(), item.Value.ToString()); 
    } 
} 
+0

以这种方式实施后,应用程序遭到了攻击。 – djkp

+0

回答者提到了两种不同的方法。您需要指定您使用的方法。如果你使用第二种方法,你可能会陷入僵局。在所有“异步”方法中使用“等待”。 – BTownTKD

+0

非常感谢它工作:)第一种方法 – djkp