AggiornamentoRaiseCanExecuteChanged Eccezione COM durante la navigazione?
Caricati progetto di esempio: https://github.com/subt13/BugSamples
ho riprodotto un errore che è stato che si verificano in un Windows 10 applicazione UAP che utilizza il quadro MVVMLight.
ricevo l'errore sotto durante la navigazione, mentre la CPU è sotto carico pesante (~ 20-25%) e la pagina è (immagini di grandi dimensioni, un sacco di controlli, ecc, ecc) "pesanti"
a System.Runtime.InteropServices.WindowsRuntime.ICommandAdapterHelpers. <> c__DisplayClass2.b__3 (Object sender , EventArgs) A System.EventHandler.Invoke (object sender, EventArgs) A GalaSoft.MvvmLight.Command.RelayCommand.RaiseCanExecuteChanged() in RaiseExecuteChangeRepo.ViewModel.MainViewModel.d__17. MoveNext()
Nell'esempio, l'errore si verifica su 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;
}
Niente di speciale sta accadendo durante la navigazione diverso dal comando associato ExecuteLoadDataCommandAsync()
sta ottenendo chiamato per caricare dati.
<Core:EventTriggerBehavior EventName="Loaded">
<Core:InvokeCommandAction Command="{Binding LoadDataCommand}">
</Core:InvokeCommandAction>
</Core:EventTriggerBehavior>
Per riprodurre, è sufficiente passare rapidamente da una pagina all'altra rapidamente per alcuni secondi e quindi attendere. Dopo non troppo tempo verrà sollevata l'eccezione.
E_FAIL è solo il voto di un insegnante per la qualità della segnalazione degli errori in WinRT. È completamente inutile diagnosticare il problema sottostante. Potrebbe * essere * un problema di threading, sempre quote non-zero per esso nel codice async/await. Ma poi potrebbe essere qualsiasi cosa. Dovrai trovare uno scenario di riproduzione affidabile, non pianificare di fare nulla per la prossima settimana. –
@ HansPassant: sì, ci sto lavorando. –
La mia ipotesi è che sia causata da "passare da una pagina all'altra rapidamente per alcuni secondi e quindi aspettare". - le tue operazioni 'async' sono ancora in esecuzione e quando si completano cercano di interagire con un albero XAML che non è più attivo. Per correggere, assicurati di essere ancora la pagina attiva prima di aumentare gli eventi. –