از حرفاتون اینطور برداشت میشه که قصد دارید بار پردازشی عمل گزارش گیری رو به یه نخ دیگه بدید تا وقفه ای در کار با فرمتون ایجاد نشه. واسه اینکار میتونید از یک BackgroundWorker استفاده کنید. این شی دو رویداد DoWork که قراره عمل اصلی که قراره به نخ جدیدمون محول بشه رو انجام بده - و RunWorkerCompleted که ازش میتونید به عنوان دریافت نتیجه کار اتمام BackgroundWorker استفاده کنید رو داره. تابع RunWorkerAsync هم واسه صدا زدن DoWork استفاده میشه. اما نکته اینجاست که اشیای ایجاد شده تو نخ اصلیتون رو نمیشه تو DoWork (برخلاف RunWorkerCompleted )استفادشون کرد و همینطور بالعکس. اما آرگومان DoWorkEventArgs e تو DoWork و RunWorkerCompleted مشترکن که میتونید نتیجه کار رو در انتهای DoWork توی پروپرتی Result این آرگومان بذارید و همون پروپرتی رو توی RunWorkerCompleted ازش استفاده کنید.
در مورد مثال شما باید CrystalReport و اشیای ارتباط با بانکت رو تو DoWork ایجاد کنید و در انتها e.Result برابر همون CrystalReport که تو همین تابع ساختید بکنید و تو RunWorkerCompleted ، همون crystalReportViewer1 که تو فرم اصلیتون ساختید رو به این شکل مقدار دهی کنید:
crystalReportViewer1.ReportSource = (CrystalReport)e.Result;
واسه ایجاد رویدادهای BackgroundWorker به این صورت اقدام می کنید
BackgroundWorker bw = new BackgroundWorker();
bw.DoWork += new DoWorkEventHandler(bw_DoWork);
bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerComplet ed);
و هرجا نیاز هست که عمل گذارش گیری انجام بشه تابع RunWorkerAsync رو صدا می زنید.