C# GetStringAsync持续时间太长,永远不会返回
我正在开发和使用API的应用程序(使用genymotion emulator进行测试),我制作了一个简单的测试内容页面,在该页面中,我有下面的代码:C# GetStringAsync持续时间太长,永远不会返回,c#,xamarin.forms,xamarin.android,httpclient,C#,Xamarin.forms,Xamarin.android,Httpclient,我正在开发和使用API的应用程序(使用genymotion emulator进行测试),我制作了一个简单的测试内容页面,在该页面中,我有下面的代码: using PlaqueoApp.Modelos; using System; using System.Collections.Generic; using System.Linq; using System.Net.Http; using System.Text; using System.Threading.Tasks; using Xama
using PlaqueoApp.Modelos;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using Xamarin.Forms;
using Xamarin.Forms.Xaml;
using System.Net.NetworkInformation;
using Newtonsoft.Json;
namespace PlaqueoApp
{
[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class RegistrarPatron : ContentPage
{
public RegistrarPatron ()
{
InitializeComponent ();
GetOficinas().Wait();
}
private async Task GetOficinas()
{
Ping myPing = new Ping();
PingReply reply = myPing.Send("8.8.8.8", 10000);
HttpClient cliente = new HttpClient();
string url = "https://reqres.in/api/users?page=2";
var response = await cliente.GetStringAsync(url);
var anonimus = JsonConvert.DeserializeObject<List<object>>(response);
}
}
}
我以为是因为Iternet连接,但我检查了Gennymotion emulator,WIFI选项是启用的。正如你们所看到的,我还对谷歌进行了ping,并获得了成功状态,我还在清单上添加了互联网权限。
我不知道我是否遗漏了什么,是否在调试我的应用程序或其他任何东西时遗漏了什么在发出请求之前修改名为
cliente
的HttpClient
上的超时,并在请求周围添加一个try/catch
块以查看发生了什么
如果有一个单独的异步方法进行调用,那么可以将try/catch放在其中,然后调用单独的方法。否则,在围绕任务包装异常处理之前,请对任务调用
.Wait()
。Wait()
将用于测试目的,而不是生产用途。在发出请求之前修改名为cliente
的HttpClient
上的超时,并在请求周围添加一个try/catch
块,以查看发生了什么
如果有一个单独的异步方法进行调用,那么可以将try/catch放在其中,然后调用单独的方法。否则,在围绕任务包装异常处理之前,请对任务调用.Wait()
。Wait()
将用于测试目的,而不是生产使用。不要这样做:
public RegistrarPatron ()
{
InitializeComponent ();
GetOficinas().Wait();
}
对于这样的任务,您几乎不应该等待():它将冻结您的应用程序或永远阻止线程
改为这样做:
namespace PlaqueoApp
{
[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class RegistrarPatron : ContentPage
{
public RegistrarPatron ()
{
InitializeComponent ();
}
protected override async void OnAppearing()
{
try
{
await GetOficinas();
}
catch (Exception exception)
{
Debug.WriteLine(e.ToString());
}
}
private async Task GetOficinas()
{
Ping myPing = new Ping();
PingReply reply = myPing.Send("8.8.8.8", 10000);
HttpClient cliente = new HttpClient();
string url = "https://reqres.in/api/users?page=2";
var response = await cliente.GetStringAsync(url);
var anonimus = JsonConvert.DeserializeObject<List<object>>(response);
}
}
}
namespace PlaqueoApp
{
[XamlCompilation(XamlCompilationOptions.Compile)]
公共部分类注册器Atron:ContentPage
{
公共注册器电子感应加速器()
{
初始化组件();
}
受保护的重写异步void OnAppearing()
{
尝试
{
等待GetOficinas();
}
捕获(异常)
{
Debug.WriteLine(例如ToString());
}
}
专用异步任务GetOficinas()
{
Ping myPing=新Ping();
PingReply-reply=myPing.Send(“8.8.8.8”,10000);
HttpClient客户端=新的HttpClient();
字符串url=”https://reqres.in/api/users?page=2";
var response=await cliente.GetStringAsync(url);
var anonimus=JsonConvert.DeserializeObject(响应);
}
}
}
不要这样做:
public RegistrarPatron ()
{
InitializeComponent ();
GetOficinas().Wait();
}
对于这样的任务,您几乎不应该等待():它将冻结您的应用程序或永远阻止线程
改为这样做:
namespace PlaqueoApp
{
[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class RegistrarPatron : ContentPage
{
public RegistrarPatron ()
{
InitializeComponent ();
}
protected override async void OnAppearing()
{
try
{
await GetOficinas();
}
catch (Exception exception)
{
Debug.WriteLine(e.ToString());
}
}
private async Task GetOficinas()
{
Ping myPing = new Ping();
PingReply reply = myPing.Send("8.8.8.8", 10000);
HttpClient cliente = new HttpClient();
string url = "https://reqres.in/api/users?page=2";
var response = await cliente.GetStringAsync(url);
var anonimus = JsonConvert.DeserializeObject<List<object>>(response);
}
}
}
namespace PlaqueoApp
{
[XamlCompilation(XamlCompilationOptions.Compile)]
公共部分类注册器Atron:ContentPage
{
公共注册器电子感应加速器()
{
初始化组件();
}
受保护的重写异步void OnAppearing()
{
尝试
{
等待GetOficinas();
}
捕获(异常)
{
Debug.WriteLine(例如ToString());
}
}
专用异步任务GetOficinas()
{
Ping myPing=新Ping();
PingReply-reply=myPing.Send(“8.8.8.8”,10000);
HttpClient客户端=新的HttpClient();
字符串url=”https://reqres.in/api/users?page=2";
var response=await cliente.GetStringAsync(url);
var anonimus=JsonConvert.DeserializeObject(响应);
}
}
}
您好,我的问题是,流永远不会到达那里,就好像它永远不会在等待Get Request时完成尝试在模拟器的浏览器中加载url您不应该使用.Wait()
,这将阻止任务完成。我假设此应用程序使用的同步上下文与Windows的同步方式相关,基于消息。由于在任务完成之前您一直在有效地阻止主线程,因此任务的完成会排队等待要执行的操作,而这永远不会执行,因为您正在阻止消息和事件的处理。删除.Wait()
,然后找到一种更好的异步方式来做你想做的事情。嗨@LasseVågsætherKarlsen。问题是,当流到达GetStringAsync时,它没有完成(当我调试时,它得到了我们的方法或得到了ir完成),我想是因为主线程继续,因为客户端正在等待响应。这个问题几乎可以肯定是由于等待,您正在阻止同步上下文,这意味着任务将永远处于不确定状态。嗨,我的问题是,流永远不会到达那里,就好像它永远不会在等待Get Request时完成尝试在模拟器的浏览器中加载url。你不应该使用。Wait()
,这将阻塞直到任务完成。我假设此应用程序使用的同步上下文与Windows的同步方式相关,基于消息。由于在任务完成之前您一直在有效地阻止主线程,因此任务的完成会排队等待要执行的操作,而这永远不会执行,因为您正在阻止消息和事件的处理。删除.Wait()
,然后找到一种更好的异步方式来做你想做的事情。嗨@LasseVågsætherKarlsen。问题是,当流到达GetStringAsync时,它没有完成(当我调试时,它得到了我们的方法或得到了ir完成),我想是因为主线程继续,因为客户端正在等待响应。这个问题几乎可以肯定是由于等待,您正在阻止同步上下文,这意味着任务将永远处于不确定状态。非常感谢,它起了作用,只是我已经删除了。等等()但它没有起作用,我不知道这是否是某个网络适配器问题