<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://nfex.ru/index.php?action=history&amp;feed=atom&amp;title=Csharp%2FCSharp_Tutorial%2FThread%2FMonitor</id>
		<title>Csharp/CSharp Tutorial/Thread/Monitor - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://nfex.ru/index.php?action=history&amp;feed=atom&amp;title=Csharp%2FCSharp_Tutorial%2FThread%2FMonitor"/>
		<link rel="alternate" type="text/html" href="http://nfex.ru/index.php?title=Csharp/CSharp_Tutorial/Thread/Monitor&amp;action=history"/>
		<updated>2026-04-29T15:57:58Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://nfex.ru/index.php?title=Csharp/CSharp_Tutorial/Thread/Monitor&amp;diff=6626&amp;oldid=prev</id>
		<title> в 15:31, 26 мая 2010</title>
		<link rel="alternate" type="text/html" href="http://nfex.ru/index.php?title=Csharp/CSharp_Tutorial/Thread/Monitor&amp;diff=6626&amp;oldid=prev"/>
				<updated>2010-05-26T15:31:53Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr style=&quot;vertical-align: top;&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Предыдущая&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Версия 15:31, 26 мая 2010&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; style=&quot;text-align: center;&quot; lang=&quot;ru&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(нет различий)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
			</entry>

	<entry>
		<id>http://nfex.ru/index.php?title=Csharp/CSharp_Tutorial/Thread/Monitor&amp;diff=6627&amp;oldid=prev</id>
		<title>Admin: 1 версия</title>
		<link rel="alternate" type="text/html" href="http://nfex.ru/index.php?title=Csharp/CSharp_Tutorial/Thread/Monitor&amp;diff=6627&amp;oldid=prev"/>
				<updated>2010-05-26T12:20:05Z</updated>
		
		<summary type="html">&lt;p&gt;1 версия&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;==Coordinate two threads using Monitor==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;using System;&lt;br /&gt;
using System.Threading;&lt;br /&gt;
public class MainClass&lt;br /&gt;
{&lt;br /&gt;
    static private int counter = 0;&lt;br /&gt;
    static private object theLock = new Object();&lt;br /&gt;
    static private void ThreadFunc1() {&lt;br /&gt;
        lock( theLock ) {&lt;br /&gt;
            for( int i = 0; i &amp;lt; 50; ++i ) {&lt;br /&gt;
                Monitor.Wait( theLock, Timeout.Infinite );&lt;br /&gt;
                Console.WriteLine( &amp;quot;{0} from Thread {1}&amp;quot;, ++counter, Thread.CurrentThread.GetHashCode() );&lt;br /&gt;
                Monitor.Pulse( theLock );&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    static private void ThreadFunc2() {&lt;br /&gt;
        lock( theLock ) {&lt;br /&gt;
            for( int i = 0; i &amp;lt; 50; ++i ) {&lt;br /&gt;
                Monitor.Pulse( theLock );&lt;br /&gt;
                Monitor.Wait( theLock, Timeout.Infinite );&lt;br /&gt;
                Console.WriteLine( &amp;quot;{0} from Thread {1}&amp;quot;, ++counter, Thread.CurrentThread.GetHashCode() );&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    static void Main() {&lt;br /&gt;
        Thread thread1 = new Thread( new ThreadStart(ThreadFunc1) );&lt;br /&gt;
        Thread thread2 = new Thread( new ThreadStart(ThreadFunc2) );&lt;br /&gt;
        thread1.Start();&lt;br /&gt;
        thread2.Start();&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;pre class=codeResult&amp;gt;1 from Thread 3&lt;br /&gt;
2 from Thread 4&lt;br /&gt;
3 from Thread 3&lt;br /&gt;
4 from Thread 4&lt;br /&gt;
5 from Thread 3&lt;br /&gt;
6 from Thread 4&lt;br /&gt;
7 from Thread 3&lt;br /&gt;
8 from Thread 4&lt;br /&gt;
9 from Thread 3&lt;br /&gt;
10 from Thread 4&lt;br /&gt;
11 from Thread 3&lt;br /&gt;
12 from Thread 4&lt;br /&gt;
13 from Thread 3&lt;br /&gt;
14 from Thread 4&lt;br /&gt;
15 from Thread 3&lt;br /&gt;
16 from Thread 4&lt;br /&gt;
17 from Thread 3&lt;br /&gt;
18 from Thread 4&lt;br /&gt;
19 from Thread 3&lt;br /&gt;
20 from Thread 4&lt;br /&gt;
21 from Thread 3&lt;br /&gt;
22 from Thread 4&lt;br /&gt;
23 from Thread 3&lt;br /&gt;
24 from Thread 4&lt;br /&gt;
25 from Thread 3&lt;br /&gt;
26 from Thread 4&lt;br /&gt;
27 from Thread 3&lt;br /&gt;
28 from Thread 4&lt;br /&gt;
29 from Thread 3&lt;br /&gt;
30 from Thread 4&lt;br /&gt;
31 from Thread 3&lt;br /&gt;
32 from Thread 4&lt;br /&gt;
33 from Thread 3&lt;br /&gt;
34 from Thread 4&lt;br /&gt;
35 from Thread 3&lt;br /&gt;
36 from Thread 4&lt;br /&gt;
37 from Thread 3&lt;br /&gt;
38 from Thread 4&lt;br /&gt;
39 from Thread 3&lt;br /&gt;
40 from Thread 4&lt;br /&gt;
41 from Thread 3&lt;br /&gt;
42 from Thread 4&lt;br /&gt;
43 from Thread 3&lt;br /&gt;
44 from Thread 4&lt;br /&gt;
45 from Thread 3&lt;br /&gt;
46 from Thread 4&lt;br /&gt;
47 from Thread 3&lt;br /&gt;
48 from Thread 4&lt;br /&gt;
49 from Thread 3&lt;br /&gt;
50 from Thread 4&lt;br /&gt;
51 from Thread 3&lt;br /&gt;
52 from Thread 4&lt;br /&gt;
53 from Thread 3&lt;br /&gt;
54 from Thread 4&lt;br /&gt;
55 from Thread 3&lt;br /&gt;
56 from Thread 4&lt;br /&gt;
57 from Thread 3&lt;br /&gt;
58 from Thread 4&lt;br /&gt;
59 from Thread 3&lt;br /&gt;
60 from Thread 4&lt;br /&gt;
61 from Thread 3&lt;br /&gt;
62 from Thread 4&lt;br /&gt;
63 from Thread 3&lt;br /&gt;
64 from Thread 4&lt;br /&gt;
65 from Thread 3&lt;br /&gt;
66 from Thread 4&lt;br /&gt;
67 from Thread 3&lt;br /&gt;
68 from Thread 4&lt;br /&gt;
69 from Thread 3&lt;br /&gt;
70 from Thread 4&lt;br /&gt;
71 from Thread 3&lt;br /&gt;
72 from Thread 4&lt;br /&gt;
73 from Thread 3&lt;br /&gt;
74 from Thread 4&lt;br /&gt;
75 from Thread 3&lt;br /&gt;
76 from Thread 4&lt;br /&gt;
77 from Thread 3&lt;br /&gt;
78 from Thread 4&lt;br /&gt;
79 from Thread 3&lt;br /&gt;
80 from Thread 4&lt;br /&gt;
81 from Thread 3&lt;br /&gt;
82 from Thread 4&lt;br /&gt;
83 from Thread 3&lt;br /&gt;
84 from Thread 4&lt;br /&gt;
85 from Thread 3&lt;br /&gt;
86 from Thread 4&lt;br /&gt;
87 from Thread 3&lt;br /&gt;
88 from Thread 4&lt;br /&gt;
89 from Thread 3&lt;br /&gt;
90 from Thread 4&lt;br /&gt;
91 from Thread 3&lt;br /&gt;
92 from Thread 4&lt;br /&gt;
93 from Thread 3&lt;br /&gt;
94 from Thread 4&lt;br /&gt;
95 from Thread 3&lt;br /&gt;
96 from Thread 4&lt;br /&gt;
97 from Thread 3&lt;br /&gt;
98 from Thread 4&lt;br /&gt;
99 from Thread 3&lt;br /&gt;
100 from Thread 4&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Increment Monitor==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;using System;&lt;br /&gt;
using System.Threading;&lt;br /&gt;
public class MainClass&lt;br /&gt;
{&lt;br /&gt;
  private static Object locker = new Object();&lt;br /&gt;
  private static int count = 0;&lt;br /&gt;
  public int IncrementCount()&lt;br /&gt;
  {&lt;br /&gt;
    int rc;&lt;br /&gt;
    lock( locker )&lt;br /&gt;
    {&lt;br /&gt;
      rc = ++count;&lt;br /&gt;
    }&lt;br /&gt;
    return rc;&lt;br /&gt;
  }&lt;br /&gt;
  public void DoCount()&lt;br /&gt;
  {&lt;br /&gt;
    for( int i = 0; i &amp;lt; 10; i++ )&lt;br /&gt;
    {&lt;br /&gt;
      System.Console.WriteLine( &amp;quot;Thread {0}: count = {1}&amp;quot;, Thread.CurrentThread.Name, IncrementCount() );&lt;br /&gt;
      Thread.Sleep( 0 );&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  [STAThread]&lt;br /&gt;
  static void Main(string[] args)&lt;br /&gt;
  {&lt;br /&gt;
    int limit = 10;&lt;br /&gt;
    Thread[] t = new Thread[ limit ];&lt;br /&gt;
    for(int k = 0; k &amp;lt; limit; k++ )&lt;br /&gt;
    {&lt;br /&gt;
      MainClass b = new MainClass();&lt;br /&gt;
      t[ k ] = new Thread( new ThreadStart( b.DoCount ) );&lt;br /&gt;
      t[ k ].Name = &amp;quot;Thread &amp;quot; + k;&lt;br /&gt;
    }&lt;br /&gt;
    for(int k = 0; k &amp;lt; limit; k++ )&lt;br /&gt;
    {&lt;br /&gt;
      t[ k ].Start();&lt;br /&gt;
    }&lt;br /&gt;
    for(int k = 0; k &amp;lt; limit; k++ )&lt;br /&gt;
    {&lt;br /&gt;
      t[ k ].Join();&lt;br /&gt;
    }&lt;br /&gt;
    System.Console.WriteLine( &amp;quot;All threads complete&amp;quot; );&lt;br /&gt;
  }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Monitor: Enter and Exit==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;using System;&lt;br /&gt;
using System.Threading;&lt;br /&gt;
class MainClass &lt;br /&gt;
{&lt;br /&gt;
  [STAThread]&lt;br /&gt;
  static void Main(string[] args)&lt;br /&gt;
  {&lt;br /&gt;
      int r = 0;&lt;br /&gt;
    object t = new object();&lt;br /&gt;
    &lt;br /&gt;
    try&lt;br /&gt;
    {&lt;br /&gt;
      Monitor.Enter( t );&lt;br /&gt;
      r++;&lt;br /&gt;
    }&lt;br /&gt;
    finally&lt;br /&gt;
    {&lt;br /&gt;
      Monitor.Exit( t );&lt;br /&gt;
    }&lt;br /&gt;
      &lt;br /&gt;
  }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;pre class=codeResult&amp;gt;in monotor&lt;br /&gt;
in monotor&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Monitor Pool==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;using System;&lt;br /&gt;
using System.Threading;&lt;br /&gt;
class MainClass&lt;br /&gt;
{&lt;br /&gt;
  private const int threads = 4;&lt;br /&gt;
  private const int workitems = 50;&lt;br /&gt;
  private static Object locker = new Object();&lt;br /&gt;
  static void Worker()&lt;br /&gt;
  {&lt;br /&gt;
    while( true )&lt;br /&gt;
    {&lt;br /&gt;
      lock( locker )&lt;br /&gt;
      {&lt;br /&gt;
        Monitor.Wait( locker );&lt;br /&gt;
      }&lt;br /&gt;
      System.Console.WriteLine( &amp;quot;{0} doing work&amp;quot;, Thread.CurrentThread.Name );&lt;br /&gt;
      Thread.Sleep( 100 );&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  [STAThread]&lt;br /&gt;
  static void Main(string[] args)&lt;br /&gt;
  {&lt;br /&gt;
    Thread[] t = new Thread[ threads ];&lt;br /&gt;
    for( int k = 0; k &amp;lt; threads; k++ )&lt;br /&gt;
    {&lt;br /&gt;
      t[ k ] = new Thread( new ThreadStart( Worker ) );&lt;br /&gt;
      t[ k ].Name = &amp;quot;Worker &amp;quot; + k;&lt;br /&gt;
      t[ k ].IsBackground = true;&lt;br /&gt;
      t[ k ].Start();&lt;br /&gt;
    }&lt;br /&gt;
    for( int i = 0; i &amp;lt; workitems; i ++ )&lt;br /&gt;
    {&lt;br /&gt;
      Thread.Sleep( 1000 );&lt;br /&gt;
      lock( locker )&lt;br /&gt;
      {&lt;br /&gt;
        Monitor.Pulse( locker );&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Monitor: try to enter==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;using System;&lt;br /&gt;
using System.Threading;&lt;br /&gt;
class MainClass &lt;br /&gt;
{&lt;br /&gt;
  [STAThread]&lt;br /&gt;
  static void Main(string[] args)&lt;br /&gt;
  {&lt;br /&gt;
    object t = new object();&lt;br /&gt;
    int r = 0;&lt;br /&gt;
    try&lt;br /&gt;
    {&lt;br /&gt;
      if ( Monitor.TryEnter( t, 250 ) )&lt;br /&gt;
      {&lt;br /&gt;
        r++;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    finally&lt;br /&gt;
    {&lt;br /&gt;
      try&lt;br /&gt;
      {&lt;br /&gt;
        Monitor.Exit( t );&lt;br /&gt;
      }&lt;br /&gt;
      catch( SynchronizationLockException sle )&lt;br /&gt;
      {&lt;br /&gt;
        Console.WriteLine(sle);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Throw exception between Monitor.Enter and Montor.Exit==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;using System;&lt;br /&gt;
using System.Threading;&lt;br /&gt;
   &lt;br /&gt;
class Database&lt;br /&gt;
{&lt;br /&gt;
    public void SaveData(string text)&lt;br /&gt;
    {&lt;br /&gt;
        Console.WriteLine(&amp;quot;[SaveData] Started&amp;quot;);&lt;br /&gt;
   &lt;br /&gt;
        Monitor.Enter(this);&lt;br /&gt;
        Console.WriteLine(&amp;quot;[SaveData] Working&amp;quot;);&lt;br /&gt;
   &lt;br /&gt;
        throw new Exception(&amp;quot;ERROR!&amp;quot;);&lt;br /&gt;
   &lt;br /&gt;
        for (int i = 0; i &amp;lt; 50; i++)&lt;br /&gt;
        {&lt;br /&gt;
            Thread.Sleep(100);&lt;br /&gt;
            Console.Write(text);&lt;br /&gt;
        }&lt;br /&gt;
        Monitor.Exit(this);&lt;br /&gt;
   &lt;br /&gt;
        Console.WriteLine(&amp;quot;\n[SaveData] Ended&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
   &lt;br /&gt;
class ThreadMonitor3App&lt;br /&gt;
{&lt;br /&gt;
    public static Database db = new Database();&lt;br /&gt;
   &lt;br /&gt;
    public static void WorkerThreadMethod1()&lt;br /&gt;
    {&lt;br /&gt;
        Console.WriteLine(&amp;quot;[WorkerThreadMethod1] Started&amp;quot;);&lt;br /&gt;
   &lt;br /&gt;
        Console.WriteLine(&amp;quot;[WorkerThreadMethod1] &amp;quot; +&lt;br /&gt;
            &amp;quot;Calling Database.SaveData&amp;quot;);&lt;br /&gt;
   &lt;br /&gt;
        try&lt;br /&gt;
        {&lt;br /&gt;
            db.SaveData(&amp;quot;x&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        catch{}&lt;br /&gt;
   &lt;br /&gt;
        Console.WriteLine(&amp;quot;[WorkerThreadMethod1] Finished&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
   &lt;br /&gt;
    public static void WorkerThreadMethod2()&lt;br /&gt;
    {&lt;br /&gt;
        Console.WriteLine(&amp;quot;[WorkerThreadMethod2] Started&amp;quot;);&lt;br /&gt;
   &lt;br /&gt;
        Console.WriteLine(&amp;quot;[WorkerThreadMethod2] &amp;quot; +&lt;br /&gt;
            &amp;quot;Calling Database.SaveData&amp;quot;);&lt;br /&gt;
        try&lt;br /&gt;
        {&lt;br /&gt;
            db.SaveData(&amp;quot;o&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        catch{}&lt;br /&gt;
   &lt;br /&gt;
        Console.WriteLine(&amp;quot;[WorkerThreadMethod2] Finished&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
   &lt;br /&gt;
    public static void Main()&lt;br /&gt;
    {&lt;br /&gt;
        ThreadStart worker1 = new ThreadStart(WorkerThreadMethod1);&lt;br /&gt;
        ThreadStart worker2 = new ThreadStart(WorkerThreadMethod2);&lt;br /&gt;
   &lt;br /&gt;
        Thread t1 = new Thread(worker1);&lt;br /&gt;
        Thread t2 = new Thread(worker2);&lt;br /&gt;
   &lt;br /&gt;
        t1.Start();&lt;br /&gt;
        t2.Start();&lt;br /&gt;
   &lt;br /&gt;
        Console.ReadLine();&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Use Monitors==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;using System;&lt;br /&gt;
using System.Collections;&lt;br /&gt;
using System.Threading;&lt;br /&gt;
class MainClass&lt;br /&gt;
{&lt;br /&gt;
  public static ArrayList MyList = new ArrayList();&lt;br /&gt;
  &lt;br /&gt;
  static void Main(string[] args)&lt;br /&gt;
  {&lt;br /&gt;
      Thread ThreadOne = new Thread(new ThreadStart(MonitorExample));&lt;br /&gt;
    ThreadOne.Start();&lt;br /&gt;
  }&lt;br /&gt;
  static void MonitorExample()&lt;br /&gt;
  {&lt;br /&gt;
    Monitor.Enter(MyList);&lt;br /&gt;
    MyList.Add(&amp;quot;a value&amp;quot;);&lt;br /&gt;
    Monitor.Exit(MyList);&lt;br /&gt;
  }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Use Monitor to control more than one Threads==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;using System;&lt;br /&gt;
using System.Threading;&lt;br /&gt;
class MyClass&lt;br /&gt;
{&lt;br /&gt;
  private int counter;&lt;br /&gt;
  public void DoSomeWork()&lt;br /&gt;
  {&lt;br /&gt;
    lock(this)&lt;br /&gt;
    {&lt;br /&gt;
      counter++;&lt;br /&gt;
      // Do the work.&lt;br /&gt;
      for(int i = 0; i &amp;lt; 5; i++)&lt;br /&gt;
      {&lt;br /&gt;
        Console.WriteLine(&amp;quot;counter: {0}, i: {1}, current thread: {2}&amp;quot;,&lt;br /&gt;
          counter, i, Thread.CurrentThread.Name);&lt;br /&gt;
        Thread.Sleep(1000);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
public class MainClass&lt;br /&gt;
{&lt;br /&gt;
  public static int Main(string[] args)&lt;br /&gt;
  {&lt;br /&gt;
    MyClass w = new MyClass();&lt;br /&gt;
    Thread workerThreadA = new Thread(new ThreadStart(w.DoSomeWork));&lt;br /&gt;
    workerThreadA.Name = &amp;quot;A&amp;quot;;&lt;br /&gt;
    Thread workerThreadB = new Thread(new ThreadStart(w.DoSomeWork));&lt;br /&gt;
    workerThreadB.Name = &amp;quot;B&amp;quot;;&lt;br /&gt;
    Thread workerThreadC = new Thread(new ThreadStart(w.DoSomeWork));&lt;br /&gt;
    workerThreadC.Name = &amp;quot;C&amp;quot;;&lt;br /&gt;
    // Now start each one.&lt;br /&gt;
    workerThreadA.Start();&lt;br /&gt;
    workerThreadB.Start();&lt;br /&gt;
    workerThreadC.Start();&lt;br /&gt;
    &lt;br /&gt;
    return 0;&lt;br /&gt;
  }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;pre class=codeResult&amp;gt;counter: 1, i: 0, current thread: A&lt;br /&gt;
counter: 1, i: 1, current thread: A&lt;br /&gt;
counter: 1, i: 2, current thread: A&lt;br /&gt;
counter: 1, i: 3, current thread: A&lt;br /&gt;
counter: 1, i: 4, current thread: A&lt;br /&gt;
counter: 2, i: 0, current thread: B&lt;br /&gt;
counter: 2, i: 1, current thread: B&lt;br /&gt;
counter: 2, i: 2, current thread: B&lt;br /&gt;
counter: 2, i: 3, current thread: B&lt;br /&gt;
counter: 2, i: 4, current thread: B&lt;br /&gt;
counter: 3, i: 0, current thread: C&lt;br /&gt;
counter: 3, i: 1, current thread: C&lt;br /&gt;
counter: 3, i: 2, current thread: C&lt;br /&gt;
counter: 3, i: 3, current thread: C&lt;br /&gt;
counter: 3, i: 4, current thread: C&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Use Wait() and Pulse() to create a ticking clock==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;//C# 2.0 The Complete Reference&lt;br /&gt;
using System; &lt;br /&gt;
using System.Threading; &lt;br /&gt;
class TickTock { &lt;br /&gt;
  public void tick(bool running) { &lt;br /&gt;
    lock(this) { &lt;br /&gt;
      if(!running) { // stop the clock &lt;br /&gt;
        Monitor.Pulse(this); // notify any waiting threads &lt;br /&gt;
        return; &lt;br /&gt;
      } &lt;br /&gt;
 &lt;br /&gt;
      Console.Write(&amp;quot;Tick &amp;quot;); &lt;br /&gt;
      Monitor.Pulse(this); // let tock() run &lt;br /&gt;
      Monitor.Wait(this); // wait for tock() to complete &lt;br /&gt;
    } &lt;br /&gt;
  } &lt;br /&gt;
 &lt;br /&gt;
  public void tock(bool running) { &lt;br /&gt;
    lock(this) { &lt;br /&gt;
      if(!running) { // stop the clock &lt;br /&gt;
        Monitor.Pulse(this); // notify any waiting threads &lt;br /&gt;
        return; &lt;br /&gt;
      } &lt;br /&gt;
 &lt;br /&gt;
      Console.WriteLine(&amp;quot;Tock&amp;quot;); &lt;br /&gt;
      Monitor.Pulse(this); // let tick() run &lt;br /&gt;
 &lt;br /&gt;
      Monitor.Wait(this); // wait for tick() to complete &lt;br /&gt;
    } &lt;br /&gt;
  } &lt;br /&gt;
}  &lt;br /&gt;
 &lt;br /&gt;
class MyThread { &lt;br /&gt;
  public Thread thrd; &lt;br /&gt;
  TickTock ttOb; &lt;br /&gt;
 &lt;br /&gt;
  // Construct a new thread. &lt;br /&gt;
  public MyThread(string name, TickTock tt) { &lt;br /&gt;
    thrd = new Thread(this.run); &lt;br /&gt;
    ttOb = tt; &lt;br /&gt;
    thrd.Name = name; &lt;br /&gt;
    thrd.Start();  &lt;br /&gt;
  } &lt;br /&gt;
 &lt;br /&gt;
  // Begin execution of new thread. &lt;br /&gt;
  void run() { &lt;br /&gt;
    if(thrd.Name == &amp;quot;Tick&amp;quot;) { &lt;br /&gt;
      for(int i=0; i&amp;lt;5; i++) ttOb.tick(true); &lt;br /&gt;
      ttOb.tick(false); &lt;br /&gt;
    } &lt;br /&gt;
    else { &lt;br /&gt;
      for(int i=0; i&amp;lt;5; i++) ttOb.tock(true); &lt;br /&gt;
      ttOb.tock(false); &lt;br /&gt;
    } &lt;br /&gt;
  } &lt;br /&gt;
} &lt;br /&gt;
 &lt;br /&gt;
class TickingClock { &lt;br /&gt;
  public static void Main() { &lt;br /&gt;
    TickTock tt = new TickTock(); &lt;br /&gt;
    MyThread mt1 = new MyThread(&amp;quot;Tick&amp;quot;, tt); &lt;br /&gt;
    MyThread mt2 = new MyThread(&amp;quot;Tock&amp;quot;, tt); &lt;br /&gt;
 &lt;br /&gt;
    mt1.thrd.Join(); &lt;br /&gt;
    mt2.thrd.Join(); &lt;br /&gt;
    Console.WriteLine(&amp;quot;Clock Stopped&amp;quot;); &lt;br /&gt;
  } &lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;pre class=codeResult&amp;gt;Tick Tock&lt;br /&gt;
Tick Tock&lt;br /&gt;
Tick Tock&lt;br /&gt;
Tick Tock&lt;br /&gt;
Tick Tock&lt;br /&gt;
Clock Stopped&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Using A Monitor==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;using System;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
using System.Text;&lt;br /&gt;
using System.Threading;&lt;br /&gt;
class Tester&lt;br /&gt;
{&lt;br /&gt;
    static long counter = 0;&lt;br /&gt;
    //new Tester();&lt;br /&gt;
    static void Main()&lt;br /&gt;
    {&lt;br /&gt;
        Thread[] myThreads = {&lt;br /&gt;
               new Thread( new ThreadStart(Decrementer) ),&lt;br /&gt;
               new Thread( new ThreadStart(Incrementer) )              &lt;br /&gt;
            };&lt;br /&gt;
        int ctr = 1;&lt;br /&gt;
        foreach (Thread myThread in myThreads)&lt;br /&gt;
        {&lt;br /&gt;
            myThread.IsBackground = true;&lt;br /&gt;
            myThread.Start();&lt;br /&gt;
            myThread.Name = &amp;quot;Thread&amp;quot; + ctr.ToString();&lt;br /&gt;
            ctr++;&lt;br /&gt;
            Console.WriteLine(&amp;quot;Started thread {0}&amp;quot;, myThread.Name);&lt;br /&gt;
            Thread.Sleep(50);&lt;br /&gt;
        }&lt;br /&gt;
        foreach (Thread myThread in myThreads)&lt;br /&gt;
        {&lt;br /&gt;
            myThread.Join();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    static void Decrementer()&lt;br /&gt;
    {&lt;br /&gt;
        try&lt;br /&gt;
        {&lt;br /&gt;
            Monitor.Enter(counter);&lt;br /&gt;
            if (counter &amp;lt; 10)&lt;br /&gt;
            {&lt;br /&gt;
                Console.WriteLine(Thread.CurrentThread.Name);&lt;br /&gt;
                Console.WriteLine(counter);&lt;br /&gt;
                Monitor.Wait(counter);&lt;br /&gt;
            }&lt;br /&gt;
            while (counter &amp;gt; 0)&lt;br /&gt;
            {&lt;br /&gt;
                long temp = counter;&lt;br /&gt;
                temp--;&lt;br /&gt;
                Thread.Sleep(1);&lt;br /&gt;
                counter = temp;&lt;br /&gt;
                Console.WriteLine(Thread.CurrentThread.Name);&lt;br /&gt;
                Console.WriteLine(counter);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        finally&lt;br /&gt;
        {&lt;br /&gt;
            Monitor.Exit(counter);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    static void Incrementer()&lt;br /&gt;
    {&lt;br /&gt;
        try&lt;br /&gt;
        {&lt;br /&gt;
            Monitor.Enter(counter);&lt;br /&gt;
            while (counter &amp;lt; 10)&lt;br /&gt;
            {&lt;br /&gt;
                long temp = counter;&lt;br /&gt;
                temp++;&lt;br /&gt;
                Thread.Sleep(1);&lt;br /&gt;
                counter = temp;&lt;br /&gt;
                Console.WriteLine(Thread.CurrentThread.Name);&lt;br /&gt;
                Console.WriteLine(counter);&lt;br /&gt;
            }&lt;br /&gt;
            Monitor.Pulse(counter);&lt;br /&gt;
        }&lt;br /&gt;
        finally&lt;br /&gt;
        {&lt;br /&gt;
            Monitor.Exit(counter);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	</feed>