PDA

View Full Version : مشکل با backgroundworker



Ir.WebDeveloper
شنبه 23 مرداد 1389, 18:55 عصر
سلام خدمت اساتید ارجمند
برای انجام یک عملیات پیچیده(زمان بر) یک متد به نام COMPREP نوشتم که در رخداد DoWork یک backgroundworker صداش میزنم.منتها در انتهای این متد قراره یک ReportViewer در یک فرم Show بشه...
ضمنا یک Progressbar هم استفاده کردم که مقدار پیشرفت رو نشون میده!
همه چیز درسته فقط زمانی که میخواد فرم گزارش رو کامل لود کنه حالتی مثله not responding پیدا میکنه و چیزی نمایش داده نمیشه...
Event مربوط به کامل شدن backgroundworker هم اجرا میشه اما نمیدونم چرا نمیتونه فرم رو نمایش بده(تصور میکنم پس از اتمام Thread گزارش اون به MainThread بر نمیگرده!)
راه حل برای استفاده از backgroundworker زمانی که قراره فرم گزارشی در background نمایش داده بشه چیه؟؟؟
ممنون دوستان.

Reza_Yarahmadi
شنبه 23 مرداد 1389, 21:22 عصر
برای نمایش فرم جدید باید از یکی از رویدادهای ProgressChanged یا RunWorkerCompleted مربوط به backgroundworker استفاده کنید.
این 2 رویداد توسط نخ اصلی برنامه اجرا میشن در حالی که رویداد DoWork توسط نخ جدیدی اجرا میشه ، نمایش فرم توی نخ جدید معمولا همچین مشکلی داره.

Ir.WebDeveloper
شنبه 23 مرداد 1389, 22:21 عصر
برای نمایش فرم جدید باید از یکی از رویدادهای ProgressChanged یا RunWorkerCompleted مربوط به backgroundworker استفاده کنید.
این 2 رویداد توسط نخ اصلی برنامه اجرا میشن در حالی که رویداد DoWork توسط نخ جدیدی اجرا میشه ، نمایش فرم توی نخ جدید معمولا همچین مشکلی داره.
من تویه اون پروسس یه دیتاست(DataTable) رو پر میکنم که باید به گزارش بفرستم.فکر میکنم باید از ویژگی Result بشه پاسش داد و در RunWorkerCompleted ازش استفاده کرد؟

Reza_Yarahmadi
یک شنبه 24 مرداد 1389, 12:19 عصر
من تویه اون پروسس یه دیتاست(DataTable) رو پر میکنم که باید به گزارش بفرستم.فکر میکنم باید از ویژگی Result بشه پاسش داد و در RunWorkerCompleted ازش استفاده کرد؟
این خاصیت در اکثر مواقع برای همین منظور استفاده میشه
در انتهای رویداد DoWork کد زیر رو بنویسید

e.Result = dataTable1;
و در رویداد RunWorkerCompleted کدی مثل کد زیر بنویسید

dataGridView1.DataSource = (DataTable)e.Result;