Асинхронный метод WCF работает только при отладке

У меня странная проблема, я создаю универсальное приложение, и все работает, когда я отлаживаю, но когда я запускаю без отладки, эмулятор пытается открыть приложение, а затем вылетает.

Вот код, который, как я знаю, не работает:

private void MenuPage_Loaded(object sender, RoutedEventArgs e)
{
   SetItemSource();
}

private async void SetItemSource()
{
   MenuItems =  await AppWinService.GetMenuEntriesAsync();     
   ItemSource = new ObservableCollection<AlphaKeyGroup<Menu>>
         ((AlphaKeyGroup<Menu>.CreateGroups(MenuItems,
                                            CultureInfo.CurrentUICulture, 
                                            s => s.MenuName, 
                                            true)));

   ((CollectionViewSource)Resources["MenuGroups"]).Source = ItemSource;

 }

Какие-либо предложения? Заранее спасибо.


person JpSiller    schedule 25.07.2015    source источник


Ответы (1)


Вы уверены, что MenuItems возвращается действительным для всех ситуаций? Что происходит по тайм-ауту?

Почему бы не проверить значение null на всякий случай:

MenuItems =  await AppWinService.GetMenuEntriesAsync();   

if ((MenuItems != null) && (MenuItems.Any())
{
   ItemSource = new ObservableCollection<AlphaKeyGroup<Menu>>(
                                          (AlphaKeyGroup<Menu>.CreateGroups(MenuItems,
                                           CultureInfo.CurrentUICulture, 
                                           s => s.MenuName, 
                                           true)));

  ((CollectionViewSource)Resources["MenuGroups"]).Source = ItemSource;
}
else 
{ 
   MessageBox.Show("Failure to get data"); 
}
person ΩmegaMan    schedule 25.07.2015
comment
Привет, Омега, да я уверен, что не подведет. Я думаю, что проблема связана с тем, что моя служба wcf обнаруживается при отладке, потому что WcfSVHost включается рядом с моими часами в правом углу, но когда я не отлаживаю, ничего не происходит, поэтому я не знаю, что кажется намек на происходящее. У тебя есть идеи? - person JpSiller; 25.07.2015
comment
@GoopsGroops Мне нужно было бы посмотреть больше кода. Может быть, вместе с проверкой, которую я упомянул, добавить больше проверок... может быть, вызов CreateGroups не работает. Вам нужно определить, где находится точная точка сбоя... для ее сбоя где-то в коде и без проверки вменяемости, если вы никогда не узнаете. Я начал размещать такие проверки в своем коде, потому что никогда не знаешь, когда и где код выйдет из строя, а обработка ошибок путем принятия передовых методов сэкономит один раз в долгосрочной перспективе. ХТН - person ΩmegaMan; 25.07.2015
comment
Привет, Омега, я уверен, что не работает сама служба, но при работе в режиме отладки Visual Studio размещает службу для меня, но я думаю, что каким-то образом мне нужно разместить ее в IIS, настроить приложение, чтобы найти его там, и таким образом оно будет работать как в режиме отладки, так и без отладки. Я не знаю, как это сделать. - person JpSiller; 25.07.2015
comment
В итоге я создал службу, размещенную в IIS, но возникает та же проблема :( - person JpSiller; 25.07.2015
comment
@GroopsGoops Visual Studio поставляется с приложением для тестирования веб-служб с именем WcfTestClient, которое можно найти в каталоге установки Visual Studio Common7\IDE. Можете ли вы проверить вызов в IIS, используя это? Кроме того, вместо вызова службы, почему бы не заглушить информацию, возвращаемую асинхронным вызовом, и не вызвать ее. Запустите его в режиме отладки, а также отпустите. Если это работает, попробуйте без возврата данных, а затем с 10 элементами. Другими словами, проведите отрицательное тестирование, чтобы определить, что вызывает сбой веб-службы. - person ΩmegaMan; 25.07.2015
comment
Я могу заставить свой веб-сервис работать, но у меня возникают проблемы с ожиданием завершения асинхронного вызова, поэтому, когда я не отлаживаю код, он просто запускается одновременно и не работает. Служба WCF не имеет ничего общего с проблемой. - person JpSiller; 25.07.2015
comment
@GoopsGoops Интересно. Затем может потребоваться реструктуризация того, как приложение обрабатывает отсутствие данных во время длительного ожидания. Это означает, что код не является полностью асинхронным в реализованном дизайне. - person ΩmegaMan; 25.07.2015