我试图在网上寻找答案,但我什么也找不到。
我拥有的这种方法看起来不错,并且似乎遵循了 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
欢迎任何想法或建议。
我相信你的问题是你使用 async/await 和一般任务的方式。
此行
Task<HttpResponseMessage> x = TTConnect.GetGeocoding(TTConnect.GetTTConnectionURL(),JSONQuery);
。需要采用异步方法并调用 await 或 。任务的结果。 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
放在公共方法返回行中,它将起作用。 或者,您可以将其删除,然后将 GetGeocodingAsync 方法与 .结果或等待它。
无论如何,关键是您没有正确使用任务,我认为对于任务如何/是什么以及如何正确使用它或异步等待,存在一点困惑。 也没什么大不了的。 只需修复代码以正确调用它,它就会正常工作(例如,抛出错误或不抛出错误)。
如果这是一个简单的控制台 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);
}