返回System.Threading.Tasks.Task`1 [<mytype>]

时间:2019-04-30 15:01:31

标签: c# async-await

这似乎是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]

更新(4/30/2019,11:09 CT): 接受@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

1 个答案:

答案 0 :(得分:3)

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

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

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

}

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

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

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

}