我试着在网上寻找答案,我找不到任何东西。
这个方法我看起来很好,并且似乎遵循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
欢迎任何想法或建议。
答案 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方法或等待它。
无论如何,重点是你没有正确使用任务,我认为对于如何/什么是任务以及如何正常使用它或使用异步等待只是有点混乱。也没什么大不了的。只需修复代码即可正确调用它,它将正常工作(例如,抛出错误或不抛出错误。)