Throw exception between Monitor.Enter and Montor.Exit : Monitor « Thread « C# / CSharp Tutorial






using System;
using System.Threading;
   
class Database
{
    public void SaveData(string text)
    {
        Console.WriteLine("[SaveData] Started");
   
        Monitor.Enter(this);
        Console.WriteLine("[SaveData] Working");
   
        throw new Exception("ERROR!");
   
        for (int i = 0; i < 50; i++)
        {
            Thread.Sleep(100);
            Console.Write(text);
        }
        Monitor.Exit(this);
   
        Console.WriteLine("\n[SaveData] Ended");
    }
}
   
class ThreadMonitor3App
{
    public static Database db = new Database();
   
    public static void WorkerThreadMethod1()
    {
        Console.WriteLine("[WorkerThreadMethod1] Started");
   
        Console.WriteLine("[WorkerThreadMethod1] " +
            "Calling Database.SaveData");
   
        try
        {
            db.SaveData("x");
        }
        catch{}
   
        Console.WriteLine("[WorkerThreadMethod1] Finished");
    }
   
    public static void WorkerThreadMethod2()
    {
        Console.WriteLine("[WorkerThreadMethod2] Started");
   
        Console.WriteLine("[WorkerThreadMethod2] " +
            "Calling Database.SaveData");
        try
        {
            db.SaveData("o");
        }
        catch{}
   
        Console.WriteLine("[WorkerThreadMethod2] Finished");
    }
   
    public static void Main()
    {
        ThreadStart worker1 = new ThreadStart(WorkerThreadMethod1);
        ThreadStart worker2 = new ThreadStart(WorkerThreadMethod2);
   
        Thread t1 = new Thread(worker1);
        Thread t2 = new Thread(worker2);
   
        t1.Start();
        t2.Start();
   
        Console.ReadLine();
    }
}








20.19.Monitor
20.19.1.Use Wait() and Pulse() to create a ticking clock
20.19.2.Use Monitors
20.19.3.Monitor: Enter and Exit
20.19.4.Monitor: try to enter
20.19.5.Coordinate two threads using Monitor
20.19.6.Use Monitor to control more than one Threads
20.19.7.Increment Monitor
20.19.8.Monitor Pool
20.19.9.Throw exception between Monitor.Enter and Montor.Exit
20.19.10.Using A Monitor
20.19.11.Use lock and Monitor to coordinate Producer and Consumer