فرض کنیم یک تابع داریم که کاری بر روی یک Label انجام میدهد.
میخواهیم این تابع را با استفاده از یک Threadدیگر فراخوانی کنیم. دقت کنید که Label توسط threadاصلی برنامه ایجاد شده و نمیتوان بصورت عادی به آن دسترسی داشت و با cross-thread exceptionمواجه میشویم.
برای این کار طبق روش زیر میتوان عمل کرد:
using System.Threading;
threadی که برای تابع مورد نظر تعریف میکنیم :
Thread t = new Thread(new ThreadStart(this.DoSomeThing));
برای تعریف تابع مورد نظر باید به نکات زیر توجه داشته باشیم:
- زمانی که کنترل مورد نظر ما (در اینجا label) دارای مقدارtrue برای خاصیت InvokeRequired باشد ما باید تابع خود را بصورت cross-thread فراخوانی کنیم. برای اینکار از متد Invoke استفاده میکنیم که یک Delegate به عنوان پارامتر میگیرد و آنرا بصورت cross-thread فراخوانی میکند.
- زمانیکه کنترل مورد نظر دارای مقدار false برای خاصیت InvokeRequiredخود باشد میتوانیم کارهای مورد نظرمان را بر روی آن انجام دهیم.
پس ما باید در ابتدا delegateی به متد مورد نظرمان تعریف کنیم و با استفاده از آن و به شکل زیر متد خود را تعریف میکنیم :
void DoSomeThing()
{
if(label.InvokeRequired)
{
delegate void myDelegate();
myDelegate del = new myDelegate(this.DoSomeThing);
Invokde(del);
}
else
//something to do on label here
}