آموزش فراخوانی یک متد با یک thread

آموزش فراخوانی یک متد با یک thread

فراخوانی یک متد با یک Thread جداگانه

معمولا متدهایی که بار پردازشی زیادی دارند موجب کندی برنامه مي‌شوند برای جلوگيری از این کار می توان این متد‌ها رو با استفاده از یک Thread متفاوت از Thread اصلی برنامه فراخوانی کرد.

using System.Threading;

فرض کنيم این متد رو داریم :

void DoSomething() { ... }

تعریف Thread جدید برای متد مورد نظر:

Thread myThread = new Thread(new ThreadStart(this.DoSomthing));

فراخوانی متد با استفاده از متد تعریف شده :

myThread.Start();

برای متوقف کردن Thread ایجاد شده:

myThread.Abort();

نکته: هر Thread فقط مي‌تواند با object‌هایی کار کند که خودش آنها را ایجاد کرده است. مثلا اگر در متود DoSomething شما بخواهيد با یک label که روی فرم است کار کنيد cross-thread exception رخ خواهد داد چون آن label بوسيله Thread اصلی برنامه ایجاد شده است.

غير فعال کردن یک رویداد در زمان اجرا

گاهی لازم است در زمان اجرا یک رویداد رو موقتا و یا برای هميشه غير فعال کنيم. برای اینکار با استفاده از =- Event handler مورد نظر را از رویداد حذف مي‌کنيم. مثال - فرض کنيد که در جایی لازم است مقدار یک TextBox رو عوض کنيم بدون آنکه بخواهيم رویداد TextChanged آن تحریک شود (البته در اینجا بصورت موقت و بعد از تخصيص مقدار آن را به حالت اول برمي‌گردانيم)

private void button1_Click(object sender, EventArgs e) { // remove event handler textBox1.TextChanged -= new EventHandler(textBox1_TextChanged); textBox1.Text = "salam"; // add event handler textBox1.TextChanged += new EventHandler(textBox1_TextChanged); } private void textBox1_TextChanged(object sender, EventArgs e) { .... MessageBox.Show("TextChanged"); .... }

یک مثال ساده از پياده سازی delegate

فرض کنيد متود ساده زیر را داریم و مي‌خواهيم به عنوان پارامتر به متود دیگری ارسال کنيم

public void DisplayNumber(int num) { MessageBox.Show(string.Format("The value is {0}", num)); }

ابتدا نوع داده‌ای جدیدی از delegate با همين signature یعنی از نوع void و با پارامتر‌ی از نوع int تعریف می‌کنيم:

public delegate void ProcessNumber(int number);

سپس متغيری از نوع داده‌ای delegate تعریف شده به صورت زیر اعلان مي‌کنيم:

ProcessNumber pn = new ProcessNumber(DisplayNumber);

حال مي‌توان این متغير را به عنوان پارامتر به هر متود دلخواهی صادر کرد (مثلا متود زیر):

public int MultiplyNumbers(int a, int b, ProcessNumber pn) { int op = a * b; pn(op); return op; }

با این فراخوانی :

MultiplyNumbers(4, 5, pn);



نظرات کاربران



عبارت امنیتی : حاصل 1 × 4 می شود :
متن پیام :