C# 在异步方法返回值之前,从异步方法导航到另一个ContentPage

C# 在异步方法返回值之前,从异步方法导航到另一个ContentPage,c#,xamarin.forms,async-await,content-pages,C#,Xamarin.forms,Async Await,Content Pages,在此异步方法返回值之前,我需要启动另一个ContentPage: public class GettingCountry : ContentPage { public static List<string> CountriesList = new List<string>(); MainPage mainPage = new MainPage(); public async Task<List<RootObject>> F

在此异步方法返回值之前,我需要启动另一个ContentPage:

public class GettingCountry : ContentPage
{
    public static List<string> CountriesList = new List<string>();

    MainPage mainPage = new MainPage();
    public async Task<List<RootObject>> FetchAsync(string url)
    {
        string jsonString;
        using (var httpClient = new System.Net.Http.HttpClient())
        {
            var stream = await httpClient.GetStreamAsync(url);
            StreamReader reader = new StreamReader(stream);
            jsonString = reader.ReadToEnd();
        }

        var listOfCountries = new List<RootObject>();

        var responseCountries = JArray.Parse(JObject.Parse(jsonString)["response"]["items"].ToString());

        foreach (var countryInResponse in responseCountries)
        {
            var rootObject = new RootObject((int)countryInResponse["id"], (string)countryInResponse["title"]);

            CountriesList.Add(rootObject.Title);
        }

        //I NEED TO NAVIGATE TO FillingPage() FROM HERE:
        await Navigation.PushAsync(new FillingPage());

        //await Navigation.PushModalAsync(new NavigationPage(new FillingPage()));

        return listOfCountries;
    }
}


但此代码
等待导航只有在我按下按钮时才能正常工作。当我按下一个按钮时,所需的页面就开始了。但是方法中的相同代码不起作用。我已经把它除掉了。它会转到一个
FillingPage()
,但当我试图从异步方法内部启动它时,它不会启动

这可能是主线程上未执行操作的结果。尝试如下方式包装代码:

Device.BeginInvokeOnMainThread(async () =>
{
    await Navigation.PushAsync(new FillingPage());
}
编辑:在收到一条私人消息后,我发现问题中没有足够的信息来了解真正的问题。应用程序正在
application.OnStart
中调用
FetchAsync
,它根本不是视图层次结构的一部分,因此导航方法无法工作。提供了以下资料:

protected override void OnStart ()
{
    getCountry();
}

private async void getCountry()
{
    var url = "...";
    GettingCountry gettingCountry = new GettingCountry();
    await gettingCountry.FetchAsync(url);
}
GettingCountry
是一个
ContentPage
像某种数据访问类一样使用,它当前不是UI的一部分,因为
MainPage
设置为其他内容。快速破解更像是:

private async void getCountry()
{
    var url = "...";
    GettingCountry gettingCountry = new GettingCountry();
    var data = await gettingCountry.FetchAsync(url);
    await MainPage.Navigation.PushAsync(new FillingPage(data));
 }
我建议在另外两个方面加以改进

  • 考虑重构
    GettingCountry
    ,因为它不需要是
    ContentPage
  • 调查替代调用,以便不使用
    async void

  • 这可能是主线程上未执行操作的结果。尝试如下方式包装代码:

    Device.BeginInvokeOnMainThread(async () =>
    {
        await Navigation.PushAsync(new FillingPage());
    }
    
    编辑:在收到一条私人消息后,我发现问题中没有足够的信息来了解真正的问题。应用程序正在
    application.OnStart
    中调用
    FetchAsync
    ,它根本不是视图层次结构的一部分,因此导航方法无法工作。提供了以下资料:

    protected override void OnStart ()
    {
        getCountry();
    }
    
    private async void getCountry()
    {
        var url = "...";
        GettingCountry gettingCountry = new GettingCountry();
        await gettingCountry.FetchAsync(url);
    }
    
    GettingCountry
    是一个
    ContentPage
    像某种数据访问类一样使用,它当前不是UI的一部分,因为
    MainPage
    设置为其他内容。快速破解更像是:

    private async void getCountry()
    {
        var url = "...";
        GettingCountry gettingCountry = new GettingCountry();
        var data = await gettingCountry.FetchAsync(url);
        await MainPage.Navigation.PushAsync(new FillingPage(data));
     }
    
    我建议在另外两个方面加以改进

  • 考虑重构
    GettingCountry
    ,因为它不需要是
    ContentPage
  • 调查替代调用,以便不使用
    async void

  • 只是一些评论,与你的问题完全无关。您可以使用
    httpClient.GetStringAsync()
    直接获取字符串。而且更有效的方法是不处理
    HttpClient
    。在后台,它是所有请求之间的共享实例,处理它会产生更多开销。详情请参见此处:只需几句评论,与您的问题完全无关。您可以使用
    httpClient.GetStringAsync()
    直接获取字符串。而且更有效的方法是不处理
    HttpClient
    。在后台,它是所有请求之间的共享实例,处理它会产生更多开销。详情请参见此处:为什么投票失败?我可以做些什么来改进答案?Device.beginInvokeMainThread是我需要的答案。我试图在异步线程上更改主页。在UI/主线程上做这件事是我应该做的。一个我不会很快忘记的教训。为什么要投否决票?我可以做些什么来改进答案?Device.beginInvokeMainThread是我需要的答案。我试图在异步线程上更改主页。在UI/主线程上做这件事是我应该做的。我不会很快忘记的一课。