如何处理 await 方法中的事件引发以管理 Windows 商店应用程序中的 ProgressBar?
How to handle event raise in await method to manage ProgressBar in Windows store app?
我想在方法调用时显示进度条。我已经按照这张票中的建议处理了它:
它不等待在当前事件中引发的事件。
即
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
完成。但它不会等待此事件,而是继续执行下一次。
有人可以建议我如何处理当前 await 调用中引发的事件吗?
cmdStore_SelectionChanged
绑定到事件处理程序并且是 async void
。不能直接等待这个方法执行完成
您可以采取一些变通办法来解决这个问题。首先介绍show/hide加载器的辅助方法。
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_SelectionChanged
和 initializeThePage
完成其执行后消失。
我想在方法调用时显示进度条。我已经按照这张票中的建议处理了它:
它不等待在当前事件中引发的事件。 即
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
完成。但它不会等待此事件,而是继续执行下一次。
有人可以建议我如何处理当前 await 调用中引发的事件吗?
cmdStore_SelectionChanged
绑定到事件处理程序并且是 async void
。不能直接等待这个方法执行完成
您可以采取一些变通办法来解决这个问题。首先介绍show/hide加载器的辅助方法。
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_SelectionChanged
和 initializeThePage
完成其执行后消失。