Если делать в одном потоке или запустить в другом с помощью new Thread(...).Start() то все работает.
А потом вы оборачиваете всё в Invoke. Естественно это работает. Только о многопоточности тут речи быть не может, ну и накладные расходы сначала на запуск в треде. потом на invoke. Работает оно так же как без треда, потому и показывает.
Если вы то что в таске обернёте в invoke оно тоже заработает, только так тоже неправильно.
Что вообще тут лучше использовать асинхронность или многопоточнсть?
Что-то мне подсказывает что ни то и ни то. Хз что такое Serialization.DownloadTable, но если там есть асинхронные методы, лучше их дёргать. Ну а так, подгрузка данных порциями всё решает.
Ну и теорию подтянуть надо, и практику.