Актуализация
Качен примерен проект: https://github.com/subt13/BugSamples
Възпроизвеждах грешка, която възниква в Windows 10 UAP приложение, което използва рамката MVVMLight.
Получавам грешката по-долу по време на навигация, докато процесорът е под голямо натоварване (~20-25%) и страницата е „тежка“ (големи изображения, много контроли и т.н. и т.н.)
в System.Runtime.InteropServices.WindowsRuntime.ICommandAdapterHelpers.‹>c__DisplayClass2.b__3(Object sender, EventArgs e) в System.EventHandler.Invoke(Object sender, EventArgs e) в GalaSoft.MvvmLight.Command.RelayCommand.RaiseCanExecuteChanged() в RaiseExe cuteChangeRepo .ViewModel.MainViewModel.d__17.MoveNext()
В примера грешката възниква на RaiseCanExecuteChanged();
private async void ExecuteLoadDataCommandAsync()
{
// cause the app to slow done.
var data = await Task.Run(() => GetData());
if (data != null)
{
this.Data.Clear();
foreach (var item in data)
{
this.Data.Add(new AnotherVM(item));
}
}
// have the select job command rerun its condition
this.SelectCommand.RaiseCanExecuteChanged();
}
// slow down the page
public List<DataItem> GetData()
{
var myList = new List<DataItem>();
for (int i = 0; i < 100000; ++i)
{
myList.Add(new DataItem("Welcome to MVVM Light"));
}
return myList;
}
Нищо специално не се случва по време на навигация, освен че командата, свързана с ExecuteLoadDataCommandAsync()
, се извиква за зареждане на данни.
<Core:EventTriggerBehavior EventName="Loaded">
<Core:InvokeCommandAction Command="{Binding LoadDataCommand}">
</Core:InvokeCommandAction>
</Core:EventTriggerBehavior>
За да възпроизведете, просто превключете от една страница на друга бързо за няколко секунди и след това просто изчакайте. След не много време изключението ще бъде повдигнато.
async
операции все още се изпълняват и когато завършат, те се опитват да взаимодействат с XAML дърво, което вече не е активно. За да коригирате, уверете се, че все още сте активната страница, преди да повдигнете събитията. - person Peter Torr - MSFT   schedule 19.09.2015ExecuteLoadDataCommandAsync
от повторно влизане и да добавите някаква логика за анулиране (така чеRaiseCanExecuteChanged
да не бъде уволнен излишно). Има много начини да направите това, някои се обсъждат тук. - person noseratio   schedule 24.09.2015