Я не уверен, зачем вам в первую очередь повышение производительности, вы пытаетесь вычислить элементы, которые должны быть в поле Автозаполнение в другом потоке, а затем назначить их свойству ItemsSource
элемента управления , Нечто похожее - то, что должен делать AutoCompleteBox.
Я попытался привязать элемент управления к списку с 10000 строками, и он отлично работает, поэтому вашей проблемой может быть размер объектов, которые вы помещаете в коллекцию. Одним из решений может быть использование только строкового представления, а затем, когда вам нужен выбранный объект, вы можете найти его на основе его представления, предполагая, что оно уникально (если нет, вы можете указать какой-то идентификатор).
Одной из основных проблем этого подхода является синхронизация потоков, теперь я объясню, почему вы получаете поведение extrange, когда даже при хорошем фильтре элементы в результатах не верны.
Фильтр вроде бы в порядке, но я могу запустить приложение один раз, и результат X будет
быть там, но результат Y не будет. Повторный запуск может привести к
там, а не X, последующие времена будут и X, и Y, и т. д.,
и т.д.
Предположим, что вы напишите «ab» в поле автозаполнения, это запустит новый BackGroundWorker
, где будет выполняться этот поиск. Все должно быть хорошо, если вы будете ждать достаточно долго. Но если вы измените поисковый запрос до того, как первый работник закончил, теперь все результаты будут смешанными. Возьмем, к примеру, следующие строки кода:
// the user searchs for "ab"
[Thread 1] Results.Clear();
[Thread 1] Results.Add(Item[1]);
[Thread 1] Results.Add(Item[2]);
...
// the user changes the search term (to "abc" for example)
[Thread 2] Results.Clear();
[Thread 2] Results.Add(Item[3]);
// but what would happen if the first BackGroundWorker hasn't finished yet,
// this means that the first thread is still running
[Thread 1] Results.Add(Item[5]); // this items doesn't match the second search
[Thread 1] Results.Add(Item[6]); // criteria, but are added to the collection
[Thread 2] Results.Add(Item[7]);
// then you'll have two treads adding items to the Result collection
[Thread 1] Results.Add(Item[2]);
...
[Dispatcher Thread] autGlobal.ItemsSource = Results;
[Dispatcher Thread] autGlobal.PopulateComplete();
Надеюсь, это поможет.