PDA

View Full Version : سوال: timeout in class



abasfar
شنبه 17 اردیبهشت 1390, 18:11 عصر
سلام
من میخوام روی کلاس timeout بزارم که اگر خودش مثلا در 15 ثانیه تمام شد هیچ وگرنه به صورت اتماتیک خارج بشود
واین کد را نوشتم


Thread t = new Thread(new ThreadStart(تابع من));
t.Start();
Thread.Sleep(15ثانیه);


اما این مشکل دارد وقتی خودش تمام میشود باز هم مدت زمان باقی ماننده را انتظار میکشد
ممنون:قلب:

ali.rezaei7
یک شنبه 18 اردیبهشت 1390, 02:01 صبح
سلام؛ متد Thread.Join مشکل شما رو برطرف میکنه. این متد ترد فراخوان را تا زمانی که ترد موردنظر خاتمه نیافته، بلوکه می کند. برای ایجاد Timeoute، مدت زمان رو بر حسب میلی ثانیه به تابع ارسال کنید. در این صورت اگر Thread در این مدت زمان به پایان برسد مقدار خروجی تابع true می باشد در غیر این صورت خروجی false میشود.

مثال
Thread t = new Thread(new ThreadStart(ss));
t.Start();

if (!t.Join(5000))
MessageBox.Show("Timeout");


برای از بین بردن ترد، بعد از مدت زمان تعیین شده دو راه رو پیشنهاد میکنم:


در ابتدای تابع زمان جار سیستم رو بوسیله آبجکتی از DateTime نگه داری کنید(زمان شروع) و در قسمت های موردنظرتون زمان فعلی رو با زمان شروع اندازه گیری کنید.
یک متغییر از عمومی از نوع bool تعریف کنید و زمانی که متد join مقدار false رو برگرداند، مقدار این متغیر رو true میکنیم و در داخل ترد این متغیر بررسی می شود؛ اگر true بود ترد خاتمه پیدا می کند.

مثال در این مورد:

bool stop = false;
----------------------------------------------
private void button1_Click(object sender, EventArgs e)
{
Thread t = new Thread(new ThreadStart(WritetoFile));
t.Start();

if (!t.Join(5000))
stop = true;
}
----------------------------------------------
private void WritetoFile()
{

int i, count=0;
StreamWriter sr = new StreamWriter("C:\\timeout.txt");

for (i = 0; ; i++)
{
if (stop == true)
{
sr.Close();
return;
}

if (i % 3000 == 0)
sr.Write("{0}. {1}\r\n", ++count, i);
}
}

این نکته رو در نظر داشته باشد که هیچ وقت از متد abort برای از بین برد یک ترد استفاده نکنید؛ به این دلیل که تضمینی وجود نداره که ترد از بین بره و همچنین عملیات درحال اجرا به پایان نمی رسد. مثلا در مثال بالا داده ها از بافر به دیسک منتقل نمی شه.