C# GetStringAsync持续时间太长,永远不会返回

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

我正在开发和使用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 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完成),我想是因为主线程继续,因为客户端正在等待响应。这个问题几乎可以肯定是由于等待,您正在阻止同步上下文,这意味着任务将永远处于不确定状态。非常感谢,它起了作用,只是我已经删除了。等等()但它没有起作用,我不知道这是否是某个网络适配器问题