【问题标题】:C# How to await a method that returns Task<dynamic>?C#如何等待返回Task<dynamic>的方法?
【发布时间】: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


【解决方案1】:

这是你需要的:

return await GetReslutstAsync(url);

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

【讨论】:

  • 你是绝对正确的,在进一步调查之后,事实证明我的问题实际上是我的 Timer 而不是 GetResults 方法。我的计时器在每个循环上分配timer.Elapsed += new ElapsedEventHandler(OnTimedEvent); 处理程序。这是多次触发我的Getresults。我只是在错误的位置寻找这个错误。谢谢!我在计时器退出之前通过timer.Elapsed -= new ElapsedEventHandler(OnTimedEvent); 解决了这个问题。
猜你喜欢
  • 1970-01-01
  • 2017-06-04
  • 2020-01-16
  • 2018-10-13
  • 2013-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-14
相关资源
最近更新 更多