برای کار با UI توی MiltiThreading شما باید در نظر داشته باشی که تردی که اون کنترل رو ایجاد کرده می تونه اون رو تغییر بده.
بنابراین شما باید یک پیغام به ترد اصلی ارسال کنی و اجرا این عمل رو به خودش واگذار کنی.
برای ارسال پیغام هم معمولا از تابع invoke یا begininvoke استفاده می شه.
برای نمونه می شه اینجوری عمل کرد:
delegate void proplus(ProgressBar sender, int i);
private void setProgress(ProgressBar sender, int i)
{
sender.Value = i;
}
تعریف یه تابع که اجرای اون رو با delegate ارسال شده به متد invoke به ترد اصلی واگذار می کنیم.
بعد در هر ترد متد invoke رو صدا می زنی و کار تموم.
public void bar1()
{
for (int i = 0; i <= 100; i++)
{
//progressBar1.Value = i; // ERROR MIDE INJA
this.Invoke(new proplus(setProgress), new object[] {progressBar1 , i });
Thread.Sleep(100);
}
}
public void bar2()
{
for (int j = 0; j <= 100; j++)
{
//progressBar2.Value = j;
this.Invoke(new proplus(setProgress), new object[] { progressBar2, j});
Thread.Sleep(100);
}
}
private void button1_Click(object sender, EventArgs e)
{
//Thread a = new Thread(bar1);
Thread b = new Thread(bar2);
// bar1();
// bar2();
new Thread(bar1).Start();
b.Start();
}
البته ریزه کاری های دیگه ای هم هست که در کارهای جدی تر باید در نظر گرفت.
به هر حال توی MiltiThreading چالش اصلی شما کار با داده های مشترک است که این مسئله MiltiThreading رو به یکی از سخت ترین مباحث برنامه نویسی تبدیل کرده.
البته توی دات نت تکنولوژی های جدیدی در این زمینه معرفی شدن که بیان اونها در اینجا نمی گنجه و شاید منظور شما هم این موارد نباشه.