Если это однопоточная версия:
ClearTree();
AddFilteredResultsToTree(someparameter);
Expand();
Не беспокойтесь о многопоточности, просто сделайте это в одном потоке. Смысл использования многопоточности - позволить главному потоку обрабатывать события пользовательского интерфейса. Если вы присоединяетесь к потоку, то вы просто запускаете фоновый поток, замораживая (не выполняя никакой работы) основной поток. Обратите внимание, что вызывая Invoke, вы все равно делегируете выполнение AddFilteredResultsToTree основному потоку.
Я бы посоветовал вам просто вызвать Expand from AddFilteredResult и использовать Dispatcher для обновления пользовательского интерфейса при необходимости или.
Другим способом (лучше всего, на мой взгляд) было бы использовать Async Pattern для этого (пример и учебное пособие здесь ), а затем в AsyncCallback обновить пользовательский интерфейс.