هیچ چیز خاصی نداره فکر کن یه thread مدیریت شده و حاضرو آماده داری استفاده می کنی به عنوان مثال
public void clickOnSaveButton()
{
btn_Save.PerformClick();
System.ComponentModel.BackgroundWorker g_newThread = new BackgroundWorker();
// زمانی که نخ جدید شروع به فعالیت میکنه این تابع فراخوانی می شود
g_newThread.DoWork+=new DoWorkEventHandler(g_newThread_DoWork);
g_newThread.RunWorkerCompleted +=new RunWorkerCompletedEventHandler(g_newThread_RunWork erCompleted);
///فراخوانی با پارامتر new object[]{this, new EventArgs()}
g_newThread.RunWorkerAsync("پارامتر های مورد نیاز تابعی که قرار فراخوانی بشه");
}
private void g_newThread_DoWork(object sender, DoWorkEventArgs e)
{
//در صورتی که با پارامتر صدا زده باشید
object[] parameter = e.Argument as object[];
if (parameter.Length == 0)
{
e.Cancel = true;
return;
}//end if
e.Result = true;
}
private void g_newThread_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
//در صورتی که در تابع فراخوان نخ آن را فعالیت آن را لغو کرده باشید
if (e.Cancelled) MessageBox.Show("");
//در صورتی که در تابع فراخوانی شده خطایی رخ دهد
if (e.Error != null) MessageBox.Show(e.Error.Message);
//نتیجه خروجی از تابع فراخوانی شده
if ((Boolean)e.Result) MessageBox.Show("");
else MessageBox.Show("");
}
فقط یک نکته یادت باشه تو این جور مواقع یعنی در thread ها اگر داری یه Control رو مقدار دهی می کنی حتما باید از توابع invoke اون Control استفاده کنی وگرنه توی ویرایش خطا میگیری
با به عنوان نمونه می تونم بگم فرض کن تابع اجرای thread قرار مقدار یک lable رو عوض کنه پس داریم
private Label lab_Title = new Label();
private delegate void changeLableValue(string _NewValue);
private void ChangeLableVlaue(string _Value)
{
lab_Title.Text = _Value;
}
private void g_newThread_DoWork(object sender, DoWorkEventArgs e)
{
//در صورتی که با پارامتر صدا زده باشید
object[] parameter = e.Argument as object[];
if (parameter.Length == 0)
{
e.Cancel = true;
return;
}//end if
changeLableValue invokeChangeValue = new changeLableValue(ChangeLableVlaue);
lab_Title.Invoke(invokeChangeValue, new object[] { "Hello Body" });
e.Result = true;
}
و به عنوان نکته آخر, فکر کنم تایمر هم یک نوع thread باشه پس به شما اجازه تغییر محتوای یک Control رو نمیده مگر اینکه از invoke ها استفاده کنی (البته چون تا به حال از تایمر استفاده نکردم مطمئن نیستم)
در کل چه از تایمر چه از BackgroundWork استفاده کنی (اگر تایمر رو درست گفته باشم) در این صورت invoke الزامیه
موفق باشی