9

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.

+0

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. –

+0

@ HansPassant: sì, ci sto lavorando. –

+1

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. –

risposta

1

Alla fine ho risolto il problema aggiungendo il seguente evento al codice sottostante.

protected override void OnNavigatedFrom(NavigationEventArgs e) 
{ 
    this.DataContext = null; 
    base.OnNavigatedFrom(e); 
} 
Problemi correlati