Vahid_Nasiri
چهارشنبه 26 آذر 1382, 00:54 صبح
مثال هجدهم :
using System.Threading;
public class yyy
{
public void abc()
{
for ( int i = 0; i<=10;i++)
{
System.Console.Write(i + " ");
Thread.Sleep(1);
}
}
public void pqr()
{
for ( int i = 0; i<=10;i++)
{
System.Console.Write(i+ "...");
Thread.Sleep(1);
}
}
}
public class zzz
{
public static void Main()
{
yyy a = new yyy();
Thread t = new Thread(new ThreadStart(a.abc));
Thread t1 = new Thread(new ThreadStart(a.pqr));
System.Console.WriteLine(t.Priority);
t.Priority = ThreadPriority.Highest;
t1.Priority = ThreadPriority.Lowest;
t.Start();
t1.Start();
}
}
Output
Normal
0 1 2 3 4 0...5 1...6 2...7 3...8 4...9 5...10 6...7...8...9...10...
در مورد طول time-slice اختصاص داده شده به یک thread و یا سایر تردها نیز می توان تصمیم گیری کرد. این مورد با تنظیم خاصیت Priority (حق تقدم) قابل حصول است. به صورت پیش فرض سطح حق تقدم مساوی 2 است. بنابراین خروجی برنامه ی بالا در ابتدا Normal می باشد. تمام تردها با این سطح حق تقدم آغاز می شوند. ThreadPriority enum دارای 5 مقدار می باشد:
• 0 - Zero
• 1 - BelowNormal
• 2 - Normal
• 3 - AboveNormal
• 4 - Highest
در برنامه ی فوق حق تقدم ترد t به بالاترین حد ممکن و حق تقدم ترد t1 به کمترین حد ممکن تنظیم شده است. بنابراین ترد t زمان بیشتری برای تکمیل کارش نسبت به ترد t1 خواهد داشت و حلقه ی for خودش را قبل از خاتمه ی ترد t1 به پایان می رساند.
مثال نوزدهم :
using System.Threading;
public class yyy
{
public void abc()
{
try
{
System.Console.WriteLine("in abc");
for ( ; ; ) ;
}
catch ( System.Exception e)
{
System.Console.WriteLine("in abc Exception " +e.ToString() );
}
finally
{
System.Console.WriteLine("in abc Finally");
}
}
}
public class zzz
{
public static void Main()
{
yyy a = new yyy();
Thread t = new Thread(new ThreadStart(a.abc));
t.Start();
Thread.Sleep(10);
t.Abort();
System.Console.ReadLine();
}
}
Output
in abc
in abc Exception System.Threading.ThreadAbortException: Thread was being aborted.
at yyy.abc()
in abc Finally
Abort نمودن یک ترد هنگامیکه مشغول اجرای کدی می باشد سبب ایجاد یک Exception خواهد شد و کد به قسمت catch و finally منتقل می گردد. یک ترد پس از انتقال به این قسمت ها خاتمه می یابد.
مثال بیستم :
using System.Threading;
public class yyy
{
public void abc()
{
try
{
System.Console.WriteLine("in abc");
for ( ; ; ) ;
}
catch ( System.Exception e)
{
System.Console.WriteLine("in abc Exception " +e.ToString() );
}
finally
{
System.Console.WriteLine("in abc Finally");
}
}
}
public class zzz
{
public static void Main()
{
yyy a = new yyy();
Thread t = new Thread(new ThreadStart(a.abc));
t.Abort();
t.Start();
}
}
Output
(no output)
Abort نمودن یک ترد قبل از شروع به اجرای کد ، هیچگونه Exception ایی را سبب نخواهد شد. زیرا ترد در مرحله ی مرگ (!) به سر می برد. بنابراین هرگز کدی در abc فراخوانی نمی گردد.
مثال بیست و یکم :
using System.Threading;
public class yyy
{
public void abc()
{
for (int i = 1 ; i<= 10 ; i++ )
{
System.Console.Write(i + " " );
Thread.Sleep(1);
}
}
}
public class zzz
{
public static void Main()
{
yyy a = new yyy();
Thread t = new Thread(new ThreadStart(a.abc));
t.Start();
Thread.Sleep(10);
t.Suspend();
System.Console.WriteLine("\n After Suspend");
Thread.Sleep(10);
System.Console.WriteLine("Before Resume");
t.Resume();
}
}
Output
1
After Suspend
Before Resume
2 3 4 5 6 7 8 9 10
ما مجاز به تعلیق (Suspend) اجرای یک ترد در هر زمانی هستیم. در مثال فوق ترد برای مدت زمانی اجرا و سپس به حالت تعلیق در آورده شده است. سپس فرمان از سرگیری مجدد (Resume) صادر گردیده است . لازم به ذکر است که تعلیق مجدد تردی که در حال تعلیق به سر می برد ، خطایی را ایجاد نخواهد کرد زیرا تعیلق مجدد بر آن اثری ندارد. یک Resume برای undo کردن میلیون ها suspend کافی است.
مثال بیست و دوم:
using System.Threading;
public class yyy
{
public void abc()
{
for ( int i = 0; i<=3;i++)
{
Thread t2 = Thread.CurrentThread;
System.Console.Write(i + " " + t2.GetHashCode() + " ");
Thread.Sleep(1);
}
}
}
public class zzz
{
public static void Main()
{
yyy a = new yyy();
Thread t = new Thread(new ThreadStart(a.abc));
Thread t1 = new Thread(new ThreadStart(a.abc));
t.Start();
t1.Start();
}
}
Output
0 2 0 3 1 2 1 3 2 2 2 3 3 2 3 3
به هر ترد به صورت ذاتی و درونی یک عدد نسبت داده می شود. به این عدد HashCode گفته می شود. Hashing پروسه ی نسبت دهی یک عدد به یک هویت است ، بطوریکه بتوان آنرا به سادگی در یک لیست طولانی مشخص کرد. این عدد برای ردگیری تعداد زیادی از تردها مفید است.
using System.Threading;
public class yyy
{
public void abc()
{
for ( int i = 0; i<=10;i++)
{
System.Console.Write(i + " ");
Thread.Sleep(1);
}
}
public void pqr()
{
for ( int i = 0; i<=10;i++)
{
System.Console.Write(i+ "...");
Thread.Sleep(1);
}
}
}
public class zzz
{
public static void Main()
{
yyy a = new yyy();
Thread t = new Thread(new ThreadStart(a.abc));
Thread t1 = new Thread(new ThreadStart(a.pqr));
System.Console.WriteLine(t.Priority);
t.Priority = ThreadPriority.Highest;
t1.Priority = ThreadPriority.Lowest;
t.Start();
t1.Start();
}
}
Output
Normal
0 1 2 3 4 0...5 1...6 2...7 3...8 4...9 5...10 6...7...8...9...10...
در مورد طول time-slice اختصاص داده شده به یک thread و یا سایر تردها نیز می توان تصمیم گیری کرد. این مورد با تنظیم خاصیت Priority (حق تقدم) قابل حصول است. به صورت پیش فرض سطح حق تقدم مساوی 2 است. بنابراین خروجی برنامه ی بالا در ابتدا Normal می باشد. تمام تردها با این سطح حق تقدم آغاز می شوند. ThreadPriority enum دارای 5 مقدار می باشد:
• 0 - Zero
• 1 - BelowNormal
• 2 - Normal
• 3 - AboveNormal
• 4 - Highest
در برنامه ی فوق حق تقدم ترد t به بالاترین حد ممکن و حق تقدم ترد t1 به کمترین حد ممکن تنظیم شده است. بنابراین ترد t زمان بیشتری برای تکمیل کارش نسبت به ترد t1 خواهد داشت و حلقه ی for خودش را قبل از خاتمه ی ترد t1 به پایان می رساند.
مثال نوزدهم :
using System.Threading;
public class yyy
{
public void abc()
{
try
{
System.Console.WriteLine("in abc");
for ( ; ; ) ;
}
catch ( System.Exception e)
{
System.Console.WriteLine("in abc Exception " +e.ToString() );
}
finally
{
System.Console.WriteLine("in abc Finally");
}
}
}
public class zzz
{
public static void Main()
{
yyy a = new yyy();
Thread t = new Thread(new ThreadStart(a.abc));
t.Start();
Thread.Sleep(10);
t.Abort();
System.Console.ReadLine();
}
}
Output
in abc
in abc Exception System.Threading.ThreadAbortException: Thread was being aborted.
at yyy.abc()
in abc Finally
Abort نمودن یک ترد هنگامیکه مشغول اجرای کدی می باشد سبب ایجاد یک Exception خواهد شد و کد به قسمت catch و finally منتقل می گردد. یک ترد پس از انتقال به این قسمت ها خاتمه می یابد.
مثال بیستم :
using System.Threading;
public class yyy
{
public void abc()
{
try
{
System.Console.WriteLine("in abc");
for ( ; ; ) ;
}
catch ( System.Exception e)
{
System.Console.WriteLine("in abc Exception " +e.ToString() );
}
finally
{
System.Console.WriteLine("in abc Finally");
}
}
}
public class zzz
{
public static void Main()
{
yyy a = new yyy();
Thread t = new Thread(new ThreadStart(a.abc));
t.Abort();
t.Start();
}
}
Output
(no output)
Abort نمودن یک ترد قبل از شروع به اجرای کد ، هیچگونه Exception ایی را سبب نخواهد شد. زیرا ترد در مرحله ی مرگ (!) به سر می برد. بنابراین هرگز کدی در abc فراخوانی نمی گردد.
مثال بیست و یکم :
using System.Threading;
public class yyy
{
public void abc()
{
for (int i = 1 ; i<= 10 ; i++ )
{
System.Console.Write(i + " " );
Thread.Sleep(1);
}
}
}
public class zzz
{
public static void Main()
{
yyy a = new yyy();
Thread t = new Thread(new ThreadStart(a.abc));
t.Start();
Thread.Sleep(10);
t.Suspend();
System.Console.WriteLine("\n After Suspend");
Thread.Sleep(10);
System.Console.WriteLine("Before Resume");
t.Resume();
}
}
Output
1
After Suspend
Before Resume
2 3 4 5 6 7 8 9 10
ما مجاز به تعلیق (Suspend) اجرای یک ترد در هر زمانی هستیم. در مثال فوق ترد برای مدت زمانی اجرا و سپس به حالت تعلیق در آورده شده است. سپس فرمان از سرگیری مجدد (Resume) صادر گردیده است . لازم به ذکر است که تعلیق مجدد تردی که در حال تعلیق به سر می برد ، خطایی را ایجاد نخواهد کرد زیرا تعیلق مجدد بر آن اثری ندارد. یک Resume برای undo کردن میلیون ها suspend کافی است.
مثال بیست و دوم:
using System.Threading;
public class yyy
{
public void abc()
{
for ( int i = 0; i<=3;i++)
{
Thread t2 = Thread.CurrentThread;
System.Console.Write(i + " " + t2.GetHashCode() + " ");
Thread.Sleep(1);
}
}
}
public class zzz
{
public static void Main()
{
yyy a = new yyy();
Thread t = new Thread(new ThreadStart(a.abc));
Thread t1 = new Thread(new ThreadStart(a.abc));
t.Start();
t1.Start();
}
}
Output
0 2 0 3 1 2 1 3 2 2 2 3 3 2 3 3
به هر ترد به صورت ذاتی و درونی یک عدد نسبت داده می شود. به این عدد HashCode گفته می شود. Hashing پروسه ی نسبت دهی یک عدد به یک هویت است ، بطوریکه بتوان آنرا به سادگی در یک لیست طولانی مشخص کرد. این عدد برای ردگیری تعداد زیادی از تردها مفید است.