【问题标题】:System.Threading.Tasks.Task`1[<myType>] being returned返回 System.Threading.Tasks.Task`1[<myType>]
【发布时间】:2019-05-01 01:05:24
【问题描述】:

这似乎与Why Async function returning System.Threading.Tasks.Task`1[System.String]? 重复,但我正在做那里的答案中建议的事情,但无济于事。

我正在运行控制台应用程序:

    static void Main(string[] args)
    {
        ...

        var details = CallRestMethodAsync(url, filterObj);
        Console.Write(details);
        Console.ReadKey();

    }

    public static async Task<NotificationEvents> CallRestMethodAsync(string url, FilterPager filterPager = null)
    {
         ...
         var result = await response.Content.ReadAsStringAsync();
         return JsonConvert.DeserializeObject<NotificationEvents>(result, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore });
    }

当我在CallRestMethodAsync 的最后一行设置断点并检查result 时,我发现它确实包含预期的对象。并且 JsonConvert 不会抛出错误。

但我得到的输出是:

System.Threading.Tasks.Task`1[NotificationsHandler.NotificationEvents]

更新(2019 年 4 月 30 日,美国东部时间 11:09): 接受@Martin Brown 的回答后,我意识到我(愚蠢地)期望在控制台上看到我的类型输出的字符串化实例。这当然行不通。我需要在Main 内部做的是: var details = (CallRestMethodAsync(url, filterObj)).Result; // to force the Task to resolve to my type foreach (var result in details.Results) // Results being a (array) property Console.Write(details.Results[0].EventDate); // EventDate being a prop that the Console could actually output

【问题讨论】:

  • 是吗?你的方法返回一个任务?您需要等待任务才能获得结果。
  • 我认为您可能会从阅读此问题中受益 + 尤其是给出的所有答案:stackoverflow.com/q/9208921/1220550
  • 你希望它输出什么?
  • @MartinBrown Gosh,我刚刚意识到我期望它输出该类型的字符串化实例。我认为我使用 javascript 的时间太长了!

标签: c# async-await


【解决方案1】:

您的 CallRestMethodAsync 方法返回 Task&lt;NotificationEvents&gt; 而不是预期的 NotificationEvents。您可以将Main 方法设置为await CallRestMethodAsync 的结果,如下所示:

static async Task Main(string[] args)
{
    ...

    var details = await CallRestMethodAsync(url, filterObj);
    Console.Write(details);
    Console.ReadKey();

}

如果您使用的是旧版本的 .net,您可能无法创建异步主方法。在这种情况下,您需要像这样获取任务的Result

static void Main(string[] args)
{
    ...

    var details = CallRestMethodAsync(url, filterObj);
    Console.Write(details.Result);
    Console.ReadKey();

}

【讨论】:

  • 当我尝试将 Main 方法异步化时,VS 在编译之前不会抱怨,出现此错误:CSC : error CS5001: Program does not contain a static 'Main' method suitable for an entry point
  • 我无法创建异步 Main 方法。 (.net 4.6)我确实在早些时候尝试了.Result的细节(尽管我读到了一些可能导致阻塞的东西)。但是,这样做会在控制台中产生NotificationsHandler.NotificationEvents
  • async main 是在 C# 7 中引入的。我不确定需要哪个 .net 版本,但我预计 4.6 还不够高。如果您在 Visual Studio 中查看项目的属性,它会告诉您可以在 Build/Advanced 下使用哪些 C# 版本。
  • NotificationsHandler.NotificationEvents 是 NotificationEvents 类的 ToString() 的默认返回值。这就是 Console.Write 正在输出的内容。如果您想要其他内容,则需要使用属性或方法调用从该对象中选择其他内容。
  • 不,它不会返回实例。 Console.WriteLine 采用字符串而不是 NotificationEvents。 C# 尝试通过调用实例的 ToString() 方法(所有对象都有的方法)将 NotificationEvents 实例转换为字符串。
猜你喜欢
  • 1970-01-01
  • 2015-07-21
  • 2013-11-23
  • 2017-03-10
  • 1970-01-01
  • 2012-06-30
  • 2011-12-31
  • 1970-01-01
  • 2014-01-21
相关资源
最近更新 更多