Из вашего описания звучит так, будто вы выиграете от многопоточности, поскольку это поможет поддерживать отзывчивость интерфейса.
И самый простой способ сделать это - использовать BackgroundWorker. Начните с проработки одного из множества образцов , затем откусите пулю и вернитесь сюда, если у вас возникнут проблемы.
В ответ на комментарий:
Лучший способ связаться из рабочего потока BackgroundWorker с основным потоком - это вызвать метод BackgroundWorker.ReportProgress
, который принимает необязательный параметр объекта userState
, который можно использовать для упаковки данных, которые вы хотите передать.
Это вызывает событие BackgroundWorker.ProgressChanged
в главном потоке, и данные могут быть обработаны без явного Invoke
.
Если вы уже реализовали события, вам придется либо переделать некоторые вызовы для вызова ReportProgress
, а не вызывать события, либо реализовать какой-либо адаптер для обработки событий и перенаправить их на вызовы ReportProgress
методов.