9

Cập nhậtRaiseCanExecuteChanged ngoại lệ COM trong khi điều hướng?

dự án mẫu Uploaded: https://github.com/subt13/BugSamples

tôi đã sao chép một lỗi mà đã xảy ra trong một ứng dụng Windows 10 UAP mà sử dụng khuôn khổ MVVMLight.

tôi nhận được báo lỗi dưới đây trong khi điều hướng trong khi CPU đang được tải nặng (~ 20-25%) và trang web là "nặng" (hình ảnh lớn, rất nhiều điều khiển, vv, vv)

tại System.Runtime.InteropServices.WindowsRuntime.ICommandAdapterHelpers. <> c__DisplayClass2.b__3 (Object sender, EventArgs e) tại System.EventHandler.Invoke (object sender, EventArgs e ) tại GalaSoft.MvvmLight.Command.RelayCommand.RaiseCanExecuteChanged() tại RaiseExecuteChangeRepo.ViewModel.MainViewModel.d__17. MoveNext()

Trong mẫu, các lỗi xảy ra trên 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; 
    } 

Không có gì đặc biệt đang xảy ra trong khi điều hướng khác so với lệnh liên quan đến ExecuteLoadDataCommandAsync() là nhận được kêu gọi để nạp dữ liệu.

<Core:EventTriggerBehavior EventName="Loaded"> 
    <Core:InvokeCommandAction Command="{Binding LoadDataCommand}"> 
    </Core:InvokeCommandAction> 
</Core:EventTriggerBehavior> 

Để tái tạo, chỉ cần chuyển từ trang này sang trang khác nhanh chóng trong vài giây và sau đó đợi. Sau khi không quá dài, ngoại lệ sẽ được nâng lên.

+0

E_FAIL chỉ là điểm của giáo viên về chất lượng báo cáo lỗi trong WinRT. Nó là hoàn toàn vô dụng để chẩn đoán vấn đề tiềm ẩn. Nó * có thể * là một vấn đề về luồng, luôn luôn là tỷ lệ không bằng không cho nó trong mã async/await. Nhưng sau đó một lần nữa nó có thể là bất cứ điều gì. Bạn sẽ phải tìm một kịch bản repro đáng tin cậy, không có kế hoạch làm bất cứ điều gì cho tuần tiếp theo. –

+0

@HansPassant - Yup, làm việc trên đó. –

+1

Tôi đoán là nó được gây ra bởi "chuyển đổi từ trang này sang trang khác nhanh chóng trong vài giây và sau đó chỉ cần chờ đợi." - các hoạt động 'async' của bạn vẫn đang chạy và khi chúng hoàn thành, chúng cố gắng tương tác với cây XAML không còn hoạt động nữa. Để khắc phục, hãy đảm bảo bạn vẫn là trang hoạt động trước khi tăng sự kiện. –

Trả lời

1

Tôi đã kết thúc khắc phục sự cố của mình bằng cách thêm sự kiện sau vào mã phía sau.

protected override void OnNavigatedFrom(NavigationEventArgs e) 
{ 
    this.DataContext = null; 
    base.OnNavigatedFrom(e); 
} 
Các vấn đề liên quan