我如何等待异步方法完成然后继续执行指令?

时间:2019-06-25 16:36:14

标签: c# xamarin.forms async-await

我正在xamarin.forms上创建一个跨平台应用程序。 我正在使用一个插件来显示一个弹出窗口。 但是,await键似乎不起作用,因为在任务完成之前继续执行。 另外,如果连续多次单击显示弹出窗口的按钮,则弹出窗口将被多次单击显示,而不是一次显示并阻塞所有其余部分。

我在按钮上附加了一条命令。每当单击按钮时,都会完全触发command属性,但是await似乎无效。

public ICommand {
            get => new Command(async () =>
            {
                if (ObjectivosDoMes.Count < 3)
                    await PopupNavigation.Instance.PushAsync(new NovoObjectivoDoMes(ObjectivosDoMes), true);
                        PodeAdicionarObjMes = ObjectivosDoMes.Count < 3 ? true : false;
            });
        }

我希望显示弹出窗口后的代码在关闭弹出窗口后立即执行。这是我用来显示弹出窗口的库:https://github.com/rotorgames/Rg.Plugins.Popup

2 个答案:

答案 0 :(得分:0)

在您的代码中,您假设PopupNavigation返回的任务将在弹出窗口关闭时完成。相反,将弹出页面推送到导航堆栈后,此任务将完成。因此,等待此任务对检测弹出窗口何时关闭没有帮助。您可以加入弹出页面的“消失事件”。这是一些独立的工作示例,不依赖于其他View / ViewModel。

       // in constructor
        ButtonTappedCommand = new Command(async () => await OnButtonTappedCommand()) ;
        page = new Rg.Plugins.Popup.Pages.PopupPage();
    }

    private async Task OnButtonTappedCommand()
    {
        page.Content = new Button() 
        { 
           Text="Close", 
           // close the popup page on tap
           Command = new Command(()=>PopupNavigation.Instance.PopAsync()) 
        };
        page.Disappearing += Popup_Disappearing;

        await PopupNavigation.Instance.PushAsync(page);
    }

    private void Popup_Disappearing(object sender, EventArgs e)
    {
        page.Disappearing -= Popup_Disappearing;
        Debug.WriteLine("Someone closed the popup");
    }

答案 1 :(得分:0)

await工作正常。您正在使用的弹出库在显示而不是在关闭时完成其PushAsync操作。请参见this issue,了解可让您await关闭的弹出窗口的解决方法。