У меня есть приложение 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.'