PDA

View Full Version : سوال: خروج از ترد ( اجرای یک بار ترد)



MehdiElexal
پنج شنبه 26 تیر 1393, 14:36 عصر
با سلام خدمت همه دوستان من یک ترد ایجاد میکنم بدین صورت
ThreadStart entryPoint = new ThreadStart(SendPDU(PhoneNumberPDU, MessageTextPDU, WaitTimePDU));
Thread depthChangeThread = new Thread(entryPoint);
depthChangeThread.Start();
و یک تابع
SendPDU

چون داخل sendpdu
thread.sleep
وجود داره ئ برنامم متوقف میشه داخل ترد گذاشتم
ولی میخوام یک بار اجرا شه و بعدش ترد متوقف شه و بسته شه تا با اجرای هر بار ترد های جدید ایجاد نشن و کند نشه مراحل اجرا
سوال: چطور پس از پایان فرامین در تابع sendpdu ترد باز شده رو متوقف کنم و ببندمش
با تشکر :)

abbas.oveissi
پنج شنبه 26 تیر 1393, 23:18 عصر
با سلام خدمت همه دوستان من یک ترد ایجاد میکنم بدین صورت
ThreadStart entryPoint = new ThreadStart(SendPDU(PhoneNumberPDU, MessageTextPDU, WaitTimePDU));
Thread depthChangeThread = new Thread(entryPoint);
depthChangeThread.Start();
و یک تابع
SendPDU

چون داخل sendpdu
thread.sleep
وجود داره ئ برنامم متوقف میشه داخل ترد گذاشتم
ولی میخوام یک بار اجرا شه و بعدش ترد متوقف شه و بسته شه تا با اجرای هر بار ترد های جدید ایجاد نشن و کند نشه مراحل اجرا
سوال: چطور پس از پایان فرامین در تابع sendpdu ترد باز شده رو متوقف کنم و ببندمش
با تشکر :)
بهترین راهش فکرکنم این باشه که تابع Interrupt استفاده کنید.میتونید با Try-Catch هندل کنید که بعد از اتفاق افتادن Interrupt چه اتفاقی بیافته(اگر کد خاصی ننویسید ترد بعد Interrupt تموم میشه).مثلا فکر کنید این تابع ای هست که ترد اجرا میکنه :
public static void runTask()
{
try
{
Thread.Sleep(10000);
}
catch (ThreadInterruptedException exception)
{
Console.WriteLine(exception.ToString());
}
}

omid nasri
جمعه 27 تیر 1393, 09:33 صبح
وقتی این کد خونده بشه ترد متوقف میشه:


System.Threading.
Thread.CurrentThread.Abort();

MehdiElexal
جمعه 27 تیر 1393, 15:30 عصر
نظرتون راجع به Abort چیه ؟ راه درستی نیست ؟ چرا ؟

abbas.oveissi
جمعه 27 تیر 1393, 16:49 عصر
نظرتون راجع به Abort چیه ؟ راه درستی نیست ؟ چرا ؟
Abort یهو خیلی بی احتیاط ترد رو میبنده،اصلا مهم نیست ترد در چه وضعیتی هست!اما Interrupt فقط زمان هایی که ترد بلاک یا منتظر چیزی هست باعث توقف ترد میشه.مثلا باید توی Abort حواست به file ها باشند که Open نمونند یا چیزهایی به این صورت.
البته جفتشون رو میشه با try-catch کنترل کرد تا قبل از بسته شدن ترد اقدامات لازم انجام بشه.
در کل یه جورایی خیلی فرق ندارند ،اصولی ترین کار اینه در داخل ترد flag هایی وجود داشته باشد که همیشه چک بشند،اگر فلگ ها عوض شدند،متناسب با اون کاری که لازم هست انجام دهید تا مجبور نباشید با Abort و Interrupt ترد رو ببندید.

آپدیت 1 : زمانی که ترد در حال اجرای کد های Unmanaged باشه ،دستور Abort کار نمیکنه تا به کد های Managed برسه.مشکل اینجاست خود فریم ورک دات نت بعضی وقت ها کدهای Unmanaged رو فراخوانی میکنه بطور مثال در دیتابیس و شبکه.برای همین احتمال داره توی این موارد شما Abort کنید اما مدتی طول بکشه تا این اتفاق بیافته که باعث میشه قابل پیش بینی نباشد.

MehdiElexal
جمعه 27 تیر 1393, 17:11 عصر
بسیار کامل و عالی ممنون