【发布时间】:2016-09-12 13:47:27
【问题描述】:
我有一个从 JSON 对象解析结果的方法。该方法返回一个 Task 对象,但是当我运行代码时,出现以下错误:
'System.Collections.Generic.Dictionary<string,object>' does not contain a definition for 'GetAwaiter'
从动态方法返回的对象是 System.Collections.Generic.Dictionary 和 System.Collections.Generic.KeyValuePair 类型的对象数组。代码如下:
private static async Task<dynamic> GetReslutstAsync(string url)
{
WebRequest request;
WebResponse response = null;
try
{
request = WebRequest.Create(url);
request.Credentials = new NetworkCredential("username", "password", "company");
//request.Credentials = CredentialCache.DefaultNetworkCredentials;
response = await request.GetResponseAsync();
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
using (var reader = new StreamReader(response.GetResponseStream()))
{
try
{
JavaScriptSerializer js = new JavaScriptSerializer();
var objects = js.Deserialize<dynamic>(reader.ReadToEnd());
return objects;
}
catch (Exception e)
{
Console.WriteLine(e.Message);
return null;
}
}
}
这里发生异常:
private static async Task<dynamic> MakeRequest(string url)
{
try
{
return await GetReslutstAsync(url).Result; //<---- This is where I get the error!
}
catch (Exception e)
{
Console.WriteLine(e.Message);
return null;
}
}
我相信这与我返回一个动态类型对象的事实有关。我怎样才能解决这个问题?我需要在“MakeRequest”方法中等待这个任务,以便在请求完成之前它不会继续。
编辑:
我的“MakeRequest”方法是这样循环的:
while (true)
{
ClockTimer timer = new ClockTimer();
timer.StartTimer(); //<---This does not stop untill 5 sec has passed
MakeRequest("www.someurl.com"); //<--- This just skips into the next loop even if not complete.
}
我的问题是MakeRequest 基本上是异步运行的,它只是跳过这个并直接进入下一个循环。我需要“MakeRequest”来暂停,直到请求完成。我已尝试删除所有 async/await 关键字,但这只会导致“未计算结果”。
【问题讨论】:
-
我认为你不需要
.Result -
那么,如果我想在“GetReslutstAsync(url)”行代码上暂停,直到“结果”被计算出来,然后继续传递那个“动态”变量呢?基本上,我真的不想异步执行此操作。这个方法在一个循环中被调用,我需要等到请求完成然后移动到下一个循环。我应该一起放弃 async/await 吗?
-
我试过
private static dynamic MakeRequest(string url)和GetReslutstAsync(url).Result;,但这只是异步运行GetResult()方法,甚至在返回结果之前循环继续。
标签: c# json dynamic async-await task