Xamarin:如何在网络服务响应之前阻止导航到另一个页面

Xamarin: How to prevent navigation to another page until web-service responds

我正在尝试调用网络服务来检索将在下一页上显示的数据。但是,页面试图在完成 Web 服务请求之前显示 空数据 。 你能帮我解决这个问题吗?

//代码

var tapGestureRecognizer = new TapGestureRecognizer();
tapGestureRecognizer.Tapped += async (s, e) =>
{                     
    getEmployeepage(mainContact.managerID);                 
    await Navigation.PushAsync(new ManagerDetailsPage(data()));             
};
manager.GestureRecognizers.Add(tapGestureRecognizer);

//获取数据的方法

public async void getEmployeepage(String searchvalue)
{
    EmployeeDetailsPage employeeDetailsPage = null;
    try
    { 
        var client = new System.Net.Http.HttpClient();

        client.BaseAddress = new Uri("http://..........");
        var response = await client.GetAsync("criterion?empId=" + searchvalue);
        string jsonString = response.Content.ReadAsStringAsync().Result;                   

        //rest of the logic            

    }
}

提前致谢。

您的方法应该可以等待。所以 public async void getEmployeepage(String searchvalue) 变成 public async Task getEmployeepage(String searchvalue)。有了这个,您可以像这样等待您的方法:

await getEmployeepage(mainContact.managerID);

使用 Async 属性扩展异步方法名称也是一个好习惯。您的方法名称将更改为 GetEmployeePageAsync。另一个好的做法是总是 return 一个任务。因此使方法可等待。此模式的唯一例外是事件处理程序。

您需要 await 您的异步调用并将您的 getEmployeepage 方法形式 async void 更改为 async Task:

var tapGestureRecognizer = new TapGestureRecognizer();
tapGestureRecognizer.Tapped += async (s, e) =>
{                     
    await getEmployeepage(mainContact.managerID);                 
    await Navigation.PushAsync(new ManagerDetailsPage(data()));             
};
manager.GestureRecognizers.Add(tapGestureRecognizer);

&

public async Task getEmployeepage(String searchvalue)
{
    EmployeeDetailsPage employeeDetailsPage = null;
    try
    { 
        var client = new System.Net.Http.HttpClient();

        client.BaseAddress = new Uri("http://..........");
        var response = await client.GetAsync("criterion?empId=" + searchvalue);
        string jsonString = await response.Content.ReadAsStringAsync();                   

        //rest of the logic            

    }
}