【发布时间】:2018-01-08 14:07:47
【问题描述】:
我有以下功能,但无法调试它,因为响应永远不会到来。另一边的服务正在工作。任何帮助都会受到重视,我无法推断出必须如何处理 SO 中的其他答案
public async Task<string> PostObjectToWebServiceAsJSON(object objectToPost, string validatorName, string method)
{
using (var client = new HttpClient())
{
client.BaseAddress = new Uri("myuri" + "/" + method);
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
// HTTP POST
var response = await client.PostAsJsonAsync("", objectToPost);
if (response.IsSuccessStatusCode)
{
return await response.Content.ReadAsStringAsync();
}
else
{
string errplugin = "Error";
return null;
}
}
}
我是这样称呼它的:
public PaymentResponseInternal Post(some stuff here)
{
Task<string> retornoPluginAsync = PostObjectToWebServiceAsJSON(some stuff here);
retornoPluginAsync.Wait();
string result = retornoPluginAsync.Result;
return JsonConvert.DeserializeObject<PaymentResponseInternal>(result);
}
【问题讨论】:
-
当您说“响应永远不会到来”时,您是什么意思?是挂了吗?你怎么调用这个函数?这很可能是一个僵局。
-
是的,这是一个死锁,因为您正在调用
retornoPluginAsync.Result。你需要await那个电话。见这里:blog.stephencleary.com/2012/07/dont-block-on-async-code.html -
听起来
public PaymentResponseInternal Post(some stuff here)应该是public async Task<PaymentResponseInternal> Post(some stuff here)并且应该在内部使用await。 -
你也在等待那个函数。异步代码就像一个病毒,一旦你开始,它会慢慢消耗你的整个项目(这是一件好事)
-
然后看看this,不幸的是,只有你才能知道哪种方法最适合解决你的问题。
标签: c# .net asynchronous async-await dotnet-httpclient