Два варианта.
1. BackgroundWorker. Это отдельный тред, делает работу (метод work) в фоновом потоке, управление возвращается в материнский поток либо по изменении прогресса, либо в конце работы. Примеры есть в
msdn. Только помните о потокобезопасности - не меняйте коллекцию из другого треда в процессе работы.
2. Async/await паттерн из .net 4.5 Эта конструкция не создает отдельных тредов и позволяет все делать в основном потоке, поэтому потокобезопасна по сути. В msdn так же есть куча
примеров.
Лично я рекомендую просто скопипастить примеры из msdn и потом постепенно менять на свой код, чтобы понять, в чем суть методов и в чем могут быть проблемы. BackgroundWorker довольно сложный паттерн, с ним лучше разобраться сначала на элементарном примере.