0

我试图在网上寻找答案,但我没有找到任何东西。

我的这个方法看起来不错,并且似乎遵循异步 post 调用在 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实际的帖子部分使用 an,然后我可以从非静态非异步方法调用此方法,并且在我的主类中,我可以处理我得到的响应,如下所示:

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

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

我正在使用TomTom 批处理 API

欢迎任何想法或建议。

4

2 回答 2

1

我相信你的问题是你使用 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 方法或等待它。

无论如何,关键是您没有正确使用任务,我认为对于任务的方式/内容以及如何正常使用它或异步等待有一点困惑。也没什么大不了的。只需修复代码以正确调用它,它就会正常工作(例如抛出错误或不抛出错误。)

于 2018-01-21T03:01:04.743 回答
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);
    }
于 2018-01-21T09:34:34.593 回答