首先加载少量DataServiceCollection项目,然后在后台加载其余项目

时间:2020-03-27 13:36:17

标签: c# wpf odata

我有一个WPF应用程序,其中UI元素绑定到DataServiceCollection<File>。在用户界面中,用户将对集合中的每个File执行一次某些操作。因此,最初并不需要所有File对象。

由于集合很大,因此加载所有元素需要很长时间。我想要的是首先将少数File个对象加载到集合中,然后启动一个过程以在不阻塞UI的情况下在后台加载其余对象。

最初,我的MainWindow这样设置DataContext

DataContext = new MyContext();

通过类型为MyInterface的实例(这是同一解决方案中类库项目中的一个类),我加载了第一批File对象:

public class MyContext {
   public DataServiceCollection<File> AllFiles { get; set; }
   public MyInterface Interface { get; set; }

   public MyContext() {
      AllFiles = Interface.LoadHandful();
   }
}

...
public class MyInterface {
   private ODataService DataService { get; set; } // ODataService inhertits DataServiceContext

   public DataServiceCollection<File> LoadHandful() {
      var q = DataService.Files.Where(..some predicate here..); // DataService is a property of type OData
      return new DataServiceCollection<File>(q.Take(5));
   }
}

我现在理想的是LoadRestAsync()类中的另一种方法MyInterface,它将异步加载剩余的File对象,而不会阻塞UI,因此用户可以开始处理带有第一批File对象,而其余对象正在加载。

我尝试将LoadAsync方法与LoadCompleted事件结合使用。我也尝试过LoadNextPartialSetAsync函数,但无济于事。我也尝试过this thread中描述的方法,但是不确定我是否真正掌握了代码。我试图从几年的中断中恢复使用C#,与此同时,我注意到了很多变化。

下面是我目前的看法,但以下是我的例外情况。

public void LoadRestAsync(DataServiceCollection<File> target, Expression<Func<File, bool>> predicate) {
  var q = DataService.Files.Where(predicate);
  DataServiceCollection<File> result = new DataServiceCollection<File>(q);
  result.LoadCompleted += (sender, args) => {
    Console.WriteLine("Finished LoadRestAsync");
    target = result;
  };
  result.LoadAsync();
}

我在result.LoadAsync()语句中收到以下异常:

System.InvalidOperationException: 'The LoadAsync method cannot be called when the DataServiceCollection is not a child collection of a related entity.'

0 个答案:

没有答案