2015-09-30 3 views
0

Я создаю приложение с использованием платформы 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 до сих пор иногда значение оказывается верным, если если условие оценивается

ответ

0

Как об отключении кнопки Назад, если вызов был отправлен в страницу B? Таким образом, вы можете убедиться, что приложение остается на странице B, ожидая ответа. Добавьте индикатор занятости, чтобы пользователь знал, что действие происходит.

+0

Да, я подумал об этом. Но отключение кнопки «Назад» противоречит рекомендациям, предоставленным Microsoft, и создает риск отказа сертификации в магазине. Я экономлю его в крайнем случае. – Corcus

1

Булево значение - хороший способ справиться с этой проблемой. Вы можете легко обойти гоночные условия, переключившись на поток пользовательского интерфейса после обратного вызова запроса. Я не знаю, IBM MobileFirst, но в основном это должно быть что-то вроде:

private void RequestCallback() 
{ 
    Dispatcher.BeginInvoke(() => 
    { 
     // Here, we are in the UI thread 
     if (isActive) 
     { 
      // The page is still active, trigger the navigation 
      NavigationService.Navigate(...); 
     } 
    }); 
} 

Кнопка возврата прессы, OnNavigatedTo, OnNavigatedFrom и метод вызывается с диспетчером все которые выполняются в потоке пользовательского интерфейса, так что вы не Не стоит беспокоиться о гоночных условиях.

+0

Это имеет смысл @KooKiz. Однако я попробовал это, и состояние гонки все еще существует. Я уточню свой вопрос с более конкретными данными и кодом. Может быть, вы можете взглянуть на него. – Corcus

+0

Мне что-то не хватает, потому что я не вижу, как может произойти гоночное состояние. Каковы симптомы? –

+0

Обновлен мой вопрос с помощью потока проб и журналов для описания симптомов @KooKiz – Corcus

Смежные вопросы