ببینید شما باید به کنترل ها، در همون Threadی که ساخته شدن دسترسی پیدا کنید و نه در Thread دیگر.کنترلهای شما (در حالت عادی) در Thread اصلی برنامه ساخته میشن.وقتی شما در BackgroundWorker به اونا دسترسی پیدا میکنید، از Thread دیگری دارین این عمل رو انجام میدین.کد که گذاشتین، فقط باعث میشه که این بررسی رو انجام نده و یه جورایی پاک کردن صورت مساله هست و روش درستی نیست.
یکی از راههای صحیحی که میشه این کارو کرد، استفاده از متد Invoke کنترلی هست که میخوایین در یک Thread دیگه باهاش کار کنید.با استفاده از این متد، کد شما در Thread اون کنترل اجرا میشه:
listBox1.Invoke(new Action( () =>
{
listBox1.Items.Add(myItem);
}));