Загрузите DataServiceCollection сначала несколько элементов, затем остальные в фоновом режиме - PullRequest
0 голосов
/ 27 марта 2020

У меня есть приложение WPF, где элемент пользовательского интерфейса связан с DataServiceCollection<File>. В пользовательском интерфейсе пользователь будет выполнять некоторые действия с каждым File в коллекции, по одному за раз. Таким образом, изначально не все объекты File необходимы.

Поскольку коллекция довольно большая, загрузка всех элементов занимает много времени. Я хотел бы сначала загрузить несколько File объектов в коллекцию, а затем запустить процесс загрузки остальных в фоновом режиме, не блокируя пользовательский интерфейс.

Изначально мои 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 объекты асинхронно, не блокируя пользовательский интерфейс, чтобы пользователь мог запустить работа с первой горсткой объектов File, в то время как остальные загружаются.

Я попытался поиграться с методом LoadAsync в сочетании с событием LoadCompleted. Я также попробовал функцию LoadNextPartialSetAsync безрезультатно. Я также попробовал подход, описанный в этой теме , но я не уверен, что действительно набрал asp код. Я пытаюсь вернуться к 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.'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...