using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Threading; class Program { static int a = 0; static int b = 0; static Random random = new Random(); static void Main(string[] args) { Thread obj = new Thread(Division); obj.Start(); Division(); } static void Division() { for (int i = 0; i <= 500; i++) { try { //Choosing random numbers between 1 to 5 a = random.Next(1, 10); b = random.Next(1, 10); //Dividing double ans = a / b; //Reset Variables a = 0; b = 0; Console.WriteLine("Answer : {0} --> {1}", i, ans); } catch (Exception ex) { Console.WriteLine(ex.ToString()); } } } }
همانطور که در کد بالا ملاحظه میکنید، متد Division به صورت Thread Safe پیاده سازی نشدهاست! اما مشکل کجاست!؟
class Program { static int a = 0; static int b = 0; static Random random = new Random(); static readonly object _object = new object(); static void Main(string[] args) { Thread obj = new Thread(Division); obj.Start(); Division(); } static void Division() { for (int i = 0; i <= 500; i++) { try { Monitor.Enter(_object); //Choosing random numbers between 1 to 5 a = random.Next(1, 10); b = random.Next(1, 10); //Dividing double ans = a / b; //Reset Variables a = 0; b = 0; Console.WriteLine("Answer : {0} --> {1}", i, ans); Monitor.Exit(_object); } catch (Exception ex) { Console.WriteLine(ex.ToString()); } } } }
مادامی که یک Thread در حالت انتخاب اعداد تصادفی تا تقسیم و اعلام نتیجه میباشد، به Threadهای داخلی دیگر، اجازهی ورود به این بخش که تحت کنترل Monitor میباشد داده نخواهد شد. همانطور که گفته شده، بازهی تحت کنترل مانیتور میتواند با بلاک Lock(object) جایگزین شود. شیء object یک شیء مشترک (static) میان تمام اشیاء است برای کنترل ورود Threadها و قفل گزاری مشترک بین این اشیاء.
static void Main() { using (var mutex = new Mutex (false, "dotnettips.info Demo")) { if (!mutex.WaitOne (TimeSpan.FromSeconds (3), false)) { Console.WriteLine ("Another app instance is running. Bye!"); return; } RunProgram(); } } static void RunProgram() { Console.WriteLine ("Running. Press Enter to exit"); Console.ReadLine(); }