如何在继续执行之前等待Navigation.PushAsync()任务完成

时间:2018-01-05 17:16:55

标签: c# xamarin xamarin.forms navigation

我有以下代码:

 Task task = Navigation.PushAsync(myPage);
 foreach(var temp in myModel)
 {

      //do bla bla
 }

在我打过的页面上,当我完成了我需要的操作时,我这样做了:

this.Navigation.PopAsync();

问题是我想在for完成执行后或task完成执行后才执行myPage循环。

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:2)

假设您使用异步方法,可以将实现更改为

await Navigation.PushAsync(myPage)

然后继续你的for循环。

如果您不在异步方法中,可以通过调用GetAwaiter()调用该方法并强制阻塞等待.GetResult();

Navigation.PushAsync(myPage).GetAwaiter().GetResult();

答案 1 :(得分:1)

您可以通过调用页面的OnDisapearing方法中的事件来执行此操作,然后您可以通过创建的导航服务订阅此事件,然后可以使用"TaskCompletionSource"进行操作,直到页面完成其工作为止然后完成任务。 有关完成此操作的更多详细信息,you can check this blog post.

以下是您应使用的导航服务的概述:

public async Task<T> NavigateToModal<T>(string modalName)
    {
        var source = new TaskCompletionSource<T>();
        if (modalName == nameof(NewItemPage))
        {
            var page = new NewItemPage();
            page.PageDisapearing += (result) =>
            {
                var res = (T)Convert.ChangeType(result, typeof(T));
                source.SetResult(res);
            };
            await App.Current.MainPage.Navigation.PushModalAsync(new NavigationPage(page));
        }
        return await source.Task;
    }

答案 2 :(得分:0)

如果我说对了,您希望在执行 let wordFirst = true; arr.sort(([wordA, indexA], [wordB, indexB]) => { const byWord = wordA.localeCompare(wordB); const byIndex = indexA - indexB; return wordFirst ? byWord || byIndex : byIndex || byWord; }); 之后执行foreach循环。对吧?

我将提出以下方法之一:

1)在this.Navigation.PopAsync()到达(推入)myPage时执行任务:您可以将对象中需要的任何数据(例如PopAsync())移交给{ {1}}并在其中执行循环

myModel

2)您在原始页面上设置了一个标记,表明它已被myPage隐藏,并在重新出现后执行代码。

protected override void OnDisappearing()
{
    base.OnDisappearing();
    foreach(var temp in myModel)
    {
         //do bla bla
    }
}