C#如何等待返回Task <dynamic>的方法?

时间:2016-05-16 17:15:11

标签: c# json dynamic async-await task

我有一个解析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;
        }
    }

我认为这与我返回动态类型对象的事实有关。我怎么能绕过这个?我需要在&#34; MakeRequest&#34;中等待这个任务。方法,以便在请求完成之前不会继续。

编辑:

我的&#34; MakeRequest&#34;方法是这样的循环:

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正在异步运行,所以基本上,它只是跳过这个并直接进入下一个循环。我需要&#34; MakeRequest&#34;在请求完成之前暂停。我已经尝试删除所有async / await关键字,但这只会导致&#34;结果未计算&#34;。

1 个答案:

答案 0 :(得分:7)

这就是你需要的:

return await GetReslutstAsync(url);

您不是在等待dynamic,而是等待返回dynamic的任务。