Что делаю не верно?

async/await говорят о том, что метод может быть выполнен асинхронно, но не гарантируют этого
new Tread() создает поток, который что-то делает. поток по умолчанию выполняется параллельно с GUI Event Loop, и чтобы вернуть данные коду внутри потока можно передать коллбэк, который будет выполнен после длительной операции
Invoke() ЕМНИП служит для синхронизации бэкграунд потока с GUI (просто так из фона нельзя обновлять данные на форме), в него нужно помещать не весь код, а только тот код, который полученные в фоне данные отправляет форме
если метод не умеет выдавать данные не разом, а по мере загрузки, интерактивное появление новых данных на форме не получится
если Вы полностью контролируете загрузку данных, можно сделать на событиях синхронизацию с GUI - загрузчик кидает событие onDataRecieved а форма на него подписана и обновляет свои данные

Если это десктопное приложение, что вроде бы Invoke выполняется в главном потоке. 
Я что-то такое помню.