等待方法导致应用程序退出

时间:2018-01-21 02:38:55

标签: c# json web-services asynchronous tomtom

我试着在网上寻找答案,我找不到任何东西。

这个方法我看起来很好,并且似乎遵循c#异步后调用的一般流程。

     private static async Task<HttpResponseMessage> GetGeocodingAsync(string URL, string JSONQuery)
    {
        using (HttpClient client = new HttpClient())
        {
            using (HttpResponseMessage r = await client.PostAsync(URL, new StringContent(JSONQuery, Encoding.UTF8, "application/json")))
            {
                return r;
            }
        }
    }

    public Task<HttpResponseMessage> GetGeocoding(string TTURL, string JSONQuery)
    {
        return GetGeocodingAsync(TTURL, JSONQuery);
    }

当我检查我的语法并在我的IDE中,但是当我运行应用程序时,它到达第5行,然后应用程序以代码0结束(以代码0(0x0)退出。 )。

我做了很多网络研究,但却找不到答案。我错过了一些基本的东西吗?

我知道我必须使用private static async作为实际的帖子部分,然后我可以从非静态非异步方法调用此方法,在我的主类中我可以处理我的响应得到这样的:

   Task<HttpResponseMessage> x = TTConnect.GetGeocoding(TTConnect.GetTTConnectionURL(),JSONQuery);

我正在尝试使用POST以JSON格式发送一些数据,通过解析检查响应,并将响应下拉到POST。

我正在使用TomTom Batch API

欢迎任何想法或建议。

2 个答案:

答案 0 :(得分:1)

如果这是一个简单的控制台exe,那么主线程中的不完整await通常会终止exe。这是因为await返回调用代码,如果退出Main(),则退出线程。如果所有非后台线程退出:您的应用退出。

在最新的C#版本中,你可以这样做:

async static Task Main() {...}

而不是:

static void Main() {...}

它会为你正常行事。或者,您可以执行以下操作:

static void Main() {
    Main2().GetAwaiter().GetResult();
}
async static Task Main2() {...} // your code here

另一种可能性是,由于没有await所有任务,你在后台线程上有一个未加注的例外。线程讨厌错误,并且线程顶部的未处理异常 会杀死你的应用。如果这是问题:await您的任务,或添加一个忽略错误的延续,如果您真的不关心成功。例如:

    static void FireAndForget(this Task task)
    {
        if (task.IsCompleted) return;
        task.ContinueWith(t =>
        {
            try
            { // show it that we checked
                GC.KeepAlive(t.Exception);
            } catch { }
        }, TaskContinuationOptions.OnlyOnFaulted);
    }

答案 1 :(得分:0)

我相信您的问题在于您使用async / await和一般任务的方式。

这一行

Task<HttpResponseMessage> x = TTConnect.GetGeocoding(TTConnect.GetTTConnectionURL(),JSONQuery);

...需要处于异步方法中并在任务上调用await或.Result。 x不是任务的结果,而是任务本身。任务只是一个托管线程吗?你正在做的是分配x线程可以说而不是线程所做的结果(...只是它不是一个线程它是一个任务但无论如何)。

为了让x成为任务的结果,你会做类似的事情......

var x = await TTConnect.GetGeocoding(TTConnect.GetTTConnectionURL(),JSONQuery);

var x = TTConnect.GetGeocoding(TTConnect.GetTTConnectionURL(),JSONQuery).Result;

另一点需要指出的是,您的private static GetGeocodingAsync方法与public GetGeoCoding方法相同。您可以将.Result放在公共方法返回行中,它将起作用。或者你可以删除它并使用.Result的GetGeocodingAsync方法或等待它。

无论如何,重点是你没有正确使用任务,我认为对于如何/什么是任务以及如何正常使用它或使用异步等待只是有点混乱。也没什么大不了的。只需修复代码即可正确调用它,它将正常工作(例如,抛出错误或不抛出错误。)