سلام ،
چند نکته :
1- اگر شما به درستی از try catch ها استفاده نکنین خیلی جاها نرم افزار خطا میده ولی اصطلاحا Resume (چشم پوشی) میکنه و این باعث میشه شما متوجه خطا نیشین ولی عملیات هم به درستی انجام نشه.
2- در خصوص ترد ها و تسک ها :
2-1 : پیشنهاد میکنم به جای BackgroundWorker(کامپوننت) از Task(کلاس) ها استفاده کنین.
2-2 : همونجوری که دوستمون در بالا اشاره کردند دسترسی به یک شی که ThreadSafe نیست به یک شی از ترد دیگه معمولا با خطای CrossThread روبرو میشین( که خیلی وقتا خطا هم نمیده ولی نرم افزار قاطی میکنه ، دیتاها جابجا و یا گم میشن !!!) ، بنا بر این شما با شرایطی خاص که در ادامه توضیح میدم میتونین به یک شی در ترد دیگه دسترسی داشته باشین.
برای دسترسی به یک کامپوننت از یک ترد دیگه از این کد استفاده کنین :
private void ThreadSafeSetLabelText(Label objLabel, string _text)
{
lock (objLabel)
{
if (objLabel.InvokeRequired)
{
objLabel.Invoke(new MethodInvoker(
delegate ()
{
objLabel.Text = _text;
}));
}
else
{
objLabel.Text = _text;
}
}
}
توجه کنین جاهایی که میخواین Text یک Label رو تغییر بدین باید از این کد استفاده کنین چون اگر مستقیم اینکار رو کنین برنامه قاطی میکنه.
برای پیاده سازی Task ها هم به این صورت عمل کنین :
new Task(() =>
{
// عمیلات شما .........
ThreadSafeSetLabelText(Label1,"درصد پیشرفت عملیات");
}).Start();
** اگر از Thread , Task و یا BackgroundWorker استفاده میکنین دقت کنین که هر شی و یا متغییری که شما در ترد اصلی نرم افزار تعریف کردین نباید به صورت unsafe در ترد های زیر مجموعه استفاده بشه مگر اینکه با متد ThreadSafe این کار رو انجام بدین(مثل قطعه کد بالا).