c# - Xamarin Forms 网页调用从不返回结果
问题描述
我有这个代码:
public async Task<List<Template>> GetTemplates(User user)
{
var postData = new List<KeyValuePair<string, string>>();
postData.Add(new KeyValuePair<string, string>("un", user.Username));
postData.Add(new KeyValuePair<string, string>("pw", user.Password));
var content = new FormUrlEncodedContent(postData);
var weburl = "myapp.org/get_templates.php";
var response = await PostResponseTemplates<Template>(weburl, content);
return response;
}
public async Task<List<Template>> PostResponseTemplates<List>(string weburl, FormUrlEncodedContent content)
{
var response = await client.PostAsync(weburl, content);
var json = response.Content.ReadAsStringAsync().Result;
.......
}
但是网络电话永远不会在此行之后返回结果:var response = await client.PostAsync(weburl, content);
.
我究竟做错了什么?
更新
这是我现在调用函数的空白:
public MemeTemplateList()
{
InitializeComponent();
LoadTemplateList();
}
private void LoadTemplateList()
{
var templateList = App.RestService.GetTemplates(App.User);
....
如何创建此异步并在页面构造函数中运行它?
解决方案
混合 async-await 和阻塞调用,如.Result
public async Task<List<Template>> PostResponseTemplates<List>(string weburl, FormUrlEncodedContent content) {
var response = await client.PostAsync(weburl, content);
var json = response.Content.ReadAsStringAsync().Result; //<--THIS WILL DEADLOCK
//...omitted for brevity
可能导致死锁。这就是函数不返回的原因。
删除.Result
并使代码一直异步
public async Task<List<Template>> PostResponseTemplates<List>(string weburl, FormUrlEncodedContent content) {
var response = await client.PostAsync(weburl, content);
var json = await response.Content.ReadAsStringAsync(); //<--THIS
//...omitted for brevity
我还建议将函数定义从通用更改
public async Task<List<Template>> PostResponseTemplates(string weburl, FormUrlEncodedContent content) {
//...
}
由于类型在函数中是已知的
List<Template> response = await PostResponseTemplates(weburl, content);
最后确保在调用堆栈中一切都是异步的
public MemeTemplateList() {
InitializeComponent();
//Subscribe to event
loadingTemplates += onLoadingTemplates;
//raise the event to load the templates.
LoadTemplateList();
}
private event EventHandler loadingTemplates = delegate { };
//ASYNC VOID ONLY ALLOWED ON EVENT HANDLER!!!!!!!
private async void onLoadingTemplates(object sender, EventArgs args) {
List<Template> templateList = await App.RestService.GetTemplates(App.User);
//....
}
private void LoadTemplateList() {
loadingTemplates(this, EventArgs.Empty);
}
推荐阅读
- c# - 使用 linq 根据另一个列表的属性从列表中删除对象
- javascript - 无法从 Angular 1.x 中的 Jasmine 测试更新 Angular 组件控制器
- azure-logic-apps - 如何在 Logic-Apps 上调试代码?
- c# - 为什么这个 IOException 不在异步方法中抛出?
- vcdiff - 关于 RFC3284 - VCDIFF 格式的说明
- c++ - 使用求解器 SparseLU 并出现错误 C2664
- angular - 带有 AOT 的延迟加载模块 - TypeError: '' 从 NGINX 提供时不是函数
- php - 使用 Imagick 在 Codeigniter php 中均衡图像
- ios - 使用 WebRTC 在本机 iOS 应用程序中共享屏幕
- matplotlib - Matplotlib 没有正确显示符号/uni-codes