Я создаю приложение с использованием платформы IBM MobileFirst Platform Foundation 6.3 для Windows Phone 8, и у меня есть такой поток.Состояние гонки между возвратом вызова и событиями OnNavigated на странице
На странице A пользователь нажимает кнопку и переходит на страницу B. На странице B пользователь нажимает другую кнопку и инициируется вызов. Если вызов возвращается успешно, пользователь переходит на страницу C.
Страница A соответствует ViewModel Avm, а другая - ViewModels Bvm и Cvm. Таким образом, вызов на странице B инициируется командой в Bvm, и туда также обрабатывается возврат.
Проблема в этом потоке. Пользователь инициирует вызов на странице B, а затем перед возвратом вызова нажимает «Назад» и переходит к странице A. Однако Bvm все еще существует, поэтому, когда вызов возвращается, пользователь переводится на страницу C со страницы A. Это недопустимое поведение.
К сожалению, MobileFirst не поддерживает отмену запросов, поэтому я не могу этого сделать при навигации со страницы.
Что я пробовал: Настройка переменной bool в Bvm, которая определяет, является ли страница B активной страницей при возврате вызова и его обновлении в событиях OnNavigatedTo и OnNavigatedFrom страницы, создает условие гонки. Если вызов возвращается во время навигации, то неясно, будет ли переменная задана во времени. То же самое касается любых изменений, которые я могу сделать в событиях навигации.
Есть ли у вас какие-либо предположения относительно того, как я могу столкнуться с этой проблемой. Возможно, способ избавиться от модели представления во времени до возврата вызова.
EDIT: более конкретные данные и код. В странице B Bvm имеет список List<AddOnItemViewModel> AvailableAddonVMs
этот список отображается на экране и команду, которая invoces вызов в каждом AddOnItemViewModel
Код для OnNavigatedFrom страницы B
var vm = this.DataContext as AddOnsViewModel;
if (e.NavigationMode == NavigationMode.Back)
{
foreach (var addOnVM in vm.AvailableAddonVMs)
{
addOnVM.IsStillOnPage = false;
System.Diagnostics.Debug.WriteLine("go back" + addOnVM.AddOn.ServiceName + addOnVM.IsStillOnPage);
}
}
base.OnNavigatingFrom(e);
Код для AddOnItemViewModel
#region check if still on page
public bool IsStillOnPage = true;
#endregion
...
//Callback function
public void AfterEnableCheck(){
Deployment.Current.Dispatcher.BeginInvoke(() =>
{
if (!IsStillOnPage)
{
System.Diagnostics.Debug.WriteLine("not on page now");
return;
}
// else continue with navigation
System.Diagnostics.Debug.WriteLine("continue navigation");
}
);
}
EDIT 2: Пример потока и журналы
потока: а вызов инициируется на стр. B -> Нажимается «Назад» до его возврата и происходит переход на страницу A -> Иногда происходит переход на страницу C, иногда это не так.
Журналы:
вернуться serviceName1 ложные
вернуться ИмяСлужбы2 ложные
. . вернуться serviceNameX ложные
не на странице теперь (навигация на страницу C не бывает)
ИЛИ
продолжить навигацию (навигация к странице C происходит).
Странно, что Eventhough IsStillOnPage устанавливается в ложь на каждом AddOnItemViewModel до сих пор иногда значение оказывается верным, если если условие оценивается
Да, я подумал об этом. Но отключение кнопки «Назад» противоречит рекомендациям, предоставленным Microsoft, и создает риск отказа сертификации в магазине. Я экономлю его в крайнем случае. – Corcus