如何在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>();
}
}
}
}
答
您需要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.Result
或task.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());
}
}
请不要永远不要'catch(Exception ex)' - 这是一个糟糕的编程习惯。 – Enigmativity
感谢您的建议,如果您提出其他好的方法,我会更有帮助。 – djkp
@javvajikiran - 简单地不抓住'Exception' - 只捕获您可能发生的可以从中恢复的特定异常。否则,不要抓住他们。你的代码目前隐藏了错误,使你的代码错误并且很难修复。 – Enigmativity