如何在等待方法中处理事件引发以管理Windows商店应用程序中的ProgressBar



我想在方法调用时显示progressbar。我已经按照这张票中的建议进行了处理:ProgressBar按钮没有';在windows商店应用中显示服务呼叫时

它不等待在当前事件内部引发的事件。即

public async void navigationHelper_LoadState(object sender, LoadStateEventArgs e)
{
    loading.Visibility = Windows.UI.Xaml.Visibility.Visible;
    await initializeThePage();
    loading.Visibility = Windows.UI.Xaml.Visibility.Collapsed;
}
//following method doesn't wait for SelectionChanged event. It should wait
private async Task initializeThePage()
{
    //few service call here
    cmdStore.SelectedIndex = 1;     //this should wait until cmdStore_SelectionChanged complete its call
}
private async void cmdStore_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    //few service call here
    loading.Visibility = Windows.UI.Xaml.Visibility.Visible;
    await getOrderlistAccordingToStore(storeID);            //get store details 
    loading.Visibility = Windows.UI.Xaml.Visibility.Collapsed;
}
public async Task getOrderlistAccordingToStore(int storeID)
{
    //calls of get orderlist according to selected store
}

cmdStore.SelectedIndex = 1;调用时,它调用cmdStore_SelectionChanged方法。在这种情况下,await initializeThePage();应该等待直到cmdStore_SelectionChanged完成。但它并没有等待这个事件,而是继续执行下一次。

有人能建议我如何处理内部引发的事件吗?

cmdStore_SelectionChanged绑定到事件处理程序,是async void。你不能直接等待这个方法的执行完成

你可以做一些变通办法来处理这个问题。首先介绍显示/隐藏加载程序的辅助方法。

int waitCounter = 0;
void ShowLoader()
{
    waitCounter += 1;
    if (waitCounter > 1) // Already loader is visible 
        return;
    loading.Visibility = Windows.UI.Xaml.Visibility.Visible;
}
void HideLoader()
{
    waitCounter -= 1;
    if (waitCounter <= 0) // No more call to wait for 
       loading.Visibility = Windows.UI.Xaml.Visibility.Collapsed;
}

之后修改您的实现,使其看起来像这个

public async void navigationHelper_LoadState(object sender, LoadStateEventArgs e)
{
    ShowLoader()
    await initializeThePage();
    HideLoader()
}
private async Task initializeThePage()
{
    //few service call here
    cmdStore.SelectedIndex = 1;
}
private async void cmdStore_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    ShowLoader();
    //few service call here
    await getOrderlistAccordingToStore(storeID);            //get store details 
    HideLoader();
}
public async Task getOrderlistAccordingToStore(int storeID)
{
    //calls of get orderlist according to selected store
}

当页面第一次初始化时,加载程序将是可见的,并且当cmdStore_SelectionChangedinitializeThePage完成执行时将消失。

最新更新