new Thread().Start() здесь лишний.
i++ нигде не юзается.
Dispatcher.Invoke(new Action(() =>
{
if (oCollectDP.Any(e => e.UserName != dp.UserName && e.IpAddress != dp.IpAddress )) // чтобы избежать дублирования
oCollectDP.Add(dp);
(sender as BackgroundWorker).ReportProgress(i);
}));