【问题标题】:Wait for a function to finish to load on Xamarin Forms等待函数完成加载到 Xamarin Forms
【发布时间】:2020-05-08 21:28:35
【问题描述】:

我正在加载一个在 App.xlm.cs 中翻译许多句子的函数,然后在为我的 MainPage 充电之后。

问题是我的函数没有完成加载并显示 MainPage。

如何确保我的函数会被加载?

这是我在 App.Xml.cs 中的函数:

public async void SetLeafLanguage() // here is the function I would like to wait before display the MainPage
{
        var phoneLanguage = "fr";// CultureInfo.CurrentUICulture.TwoLetterISOLanguageName;

        // transversal
        var WarningConnexionText = await MicosoftTranslater.TranslateText("this the first text", phoneLanguage);

        // Test page 
        var NumberOfWords = await MicosoftTranslater.TranslateText("this the second text", phoneLanguage);


        var ExerciceTitle = await MicosoftTranslater.TranslateText("this the second text", phoneLanguage);

        var AnswerPlaceHolder = await MicosoftTranslater.TranslateText("this the second text", phoneLanguage);

        var LabelNumberOfWordToTranslate = await MicosoftTranslater.TranslateText("this the second text", phoneLanguage);

        // parameter labels
        var AboutUstext = await MicosoftTranslater.TranslateText("this the second text", phoneLanguage);

}

public void  GetUserOnData()
{
    SetLeafLanguage();
    MainPage = new MainPage();
}

public App ()
{
    InitializeComponent();
    GetUserOnData();
}

【问题讨论】:

    标签: c# xamarin.forms


    【解决方案1】:

    您需要将方法的返回类型设为Task 而不是void

    您应该始终避免使用async void 方法。参见微软的Async/Await - Best Practices

    把你的代码改成这样:

    public async Task SetLeafLanguage() // here is the function I would like to wait before display the MainPage
    {
            var phoneLanguage = "fr";// CultureInfo.CurrentUICulture.TwoLetterISOLanguageName;
    
            // transversal
            var WarningConnexionText = await MicosoftTranslater.TranslateText("this the first text", phoneLanguage);
    
            // Test page 
            var NumberOfWords = await MicosoftTranslater.TranslateText("this the second text", phoneLanguage);
    
    
            var ExerciceTitle = await MicosoftTranslater.TranslateText("this the second text", phoneLanguage);
    
            var AnswerPlaceHolder = await MicosoftTranslater.TranslateText("this the second text", phoneLanguage);
    
            var LabelNumberOfWordToTranslate = await MicosoftTranslater.TranslateText("this the second text", phoneLanguage);
    
            // parameter labels
            var AboutUstext = await MicosoftTranslater.TranslateText("this the second text", phoneLanguage);
    
    }
    
    public async Task GetUserOnData()
    {
        await SetLeafLanguage();
        MainPage = new MainPage();
    }
    
    public App ()
    {
        InitializeComponent();
        GetUserOnData();
    }
    

    不同之处在于,现在SetLeafLanguageGetUserOnData 两种方法都是async Task 类型。这意味着您可以简单地使用awaitSetLeafLanguage 方法。当你await它时,这意味着你将等待方法返回一些东西,然后你可以确定它已经完成了处理。

    您可以在此处阅读有关异步返回类型的更多信息 - Async Return Types (C#)

    【讨论】:

    • 现在有什么问题?
    • “SetLeafLanguage”中的一些等待没有完成,是否有等待同时启动所有等待?
    • 是的,您可以在所有任务上使用 Task.WaitAll()。它接受一系列任务并等待所有任务。
    猜你喜欢
    • 2017-12-14
    • 1970-01-01
    • 2014-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-16
    • 2020-06-10
    • 1970-01-01
    相关资源
    最近更新 更多