PDA

View Full Version : ThreadAbortException



hdv212
یک شنبه 21 مرداد 1386, 00:05 صبح
سلام و خسته نباشید
من یه برنامه client/server با sqlServer 2005 نوشتم که توی فرم اصلی برنامه وقتی کاربرمثلا دکمه 1 رو میزنه، فرم شماره 1 باز میشه و اطلاعاتش از دیتابیس در شبکه لود میشه، برای اینکه به کاربر نشون بدم فرم در حال لود شدنه یه فرم waiting بهش نشون میدم که با یه آبجکت thread باز میشه و اطلاعات لود میشه و دوباره از طریق تابع Abort() مربوط به آبجکت thread بسته میشه، اینم کد :


private void Frm_Land_Load(object sender, EventArgs e)
{
System.Threading.Thread th = new System.Threading.Thread(gu.Show_WaitingForm);
th.Start("در حال بار گذاری اطلاعات ...");
Application.DoEvents();

this.Initialize_Data();
this.txt_date.Text = this.sh.Show_Hijri_System();
this.toolStripStatusLabel1.Text = "آماده";

Application.DoEvents();
th.Abort();
}

این برنامه زمانی که روی سیستم خودم باشه مشکلی نداره، ولی زمانی که روی سیستم دیگه ای میریزم و اجراش میکنم، ThreadAbortException اتفاق میفته و پیغام زیر رو میده :
thread was being aborted

کسی تا حالا به این مشکل برخورد کرده و چطوری مشکلو حل کردین ؟

Amir Oveisi
یک شنبه 21 مرداد 1386, 01:34 صبح
منم برخوردم قبلا فکر کنم وقتی thread قبلا abort میشه و دوباره میخوایم abort اش کنیم این exception و میده

hdv212
یک شنبه 21 مرداد 1386, 03:51 صبح
اصلا متد Abort() باعث وقوع ThreadAbortException میشه، ولی نمیدونم چرا روی سیستم خودم مشکلی نداره ولی روی سیستم دیگه این استثنا رخ میده، یه بار رخ میده و یه بار نمیده، از بلوک try-catch هم استفاده کردم، باز بعضی وقتها نمیشه، بعضی وقتها میشه، نمیدونم چطوری این استثنا رو catch کنم.

hdv212
یک شنبه 21 مرداد 1386, 13:44 عصر
جوابشو پیدا کردم، به جای تابع Abort یه متد دیگه مثل Hide_WaitingForm() برای بستن فرم میسازیم، و وقتی کارهامون تموم شد و خواستم form loading رو ببندیم، از این کد استفاده میکنیم :


//create new public instance of the waiting form
Frm_Waiting fw = new Frm_Waiting();

//create a method and pass to it subject of process to show to User
private void ShowWaitForm(object message)
{
fw.label1.Text = message.ToString();
fw.ShowDialog();
}

//create a method to close waiting form
public void Hide_WaitingForm()
{
if (frm.InvokeRequired)
{
frm.BeginInvoke(new MethodInvoker(Hide_WaitingForm), null);
}
else
{
frm.Close();
}
}

//and use it like this code :
System.Threading.Thread th = new System.Threading.Thread(gu.Show_WaitingForm);

Application.DoEvents();
th.Start("در حال بار گذاری اطلاعات ...");

this.Initialize_Data();
this.txt_date.Text = this.sh.Show_Hijri_System();
this.toolStripStatusLabel1.Text = "آماده";

Application.DoEvents();
gu.Hide_WaitingForm();

rasoul_ras
یک شنبه 21 مرداد 1386, 14:01 عصر
چرا از abort?
شما وقتی یک تردی را شروع می کنید
این شما ئید که باید تصمیم بگیرید چگونه یک ترد رو کارش رو تمام کنید نه اینکه کلا ترد را قطع کنید
این کار درستی نیست