9

更新RaiseCanExecuteChanged導航期間的COM異常?

上傳樣本項目:https://github.com/subt13/BugSamples

我已複製已經在利用MVVMLight框架在Windows 10 UAP應用已經發生的錯誤。

我接收低於錯誤導航期間在CPU處於重負載(〜20-25%)下和在網頁是「重」(放大圖,大量的控制等,等)

at System.Runtime.InteropServices.WindowsRuntime.ICommandAdapterHelpers。 <> c__DisplayClass2.b__3(對象 發件人,EventArgs e)上System.EventHandler.Invoke(對象發件人, EventArgs e)上 GalaSoft.MvvmLight.Command.RelayCommand.RaiseCanExecuteChanged()在 RaiseExecuteChangeRepo.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> 

複製,簡單地從一個頁面切換到其它快速幾秒鐘,然後就等待。在不久之後,異常會被提出。

+0

E_FAIL只是WinRT中錯誤報告質量的教師等級。診斷潛在的問題是完全沒有用的。它*可能是一個線程問題,在異步/等待代碼中它總是非零的可能性。但是,這又可能是任何事情。你必須找到一個可靠的repro場景,不要計劃在下週完成任何事情。 –

+0

@HansPassant - 是的,正在努力。 –

+1

我的猜測是,它是由「從一頁快速切換到另一頁幾秒鐘,然後等待」引起的。 - 你的'async'操作仍在運行,當它們完成時,它們嘗試與不再處於活動狀態的XAML樹進行交互。要解決這個問題,請確保您在舉辦活動之前仍然是活動頁面。 –

回答

1

我最終通過向後面的代碼添加以下事件來解決我的問題。

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