<?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%2FC_Sharp%2FThread%2FThread_Sync</id>
		<title>Csharp/C Sharp/Thread/Thread Sync - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://nfex.ru/index.php?action=history&amp;feed=atom&amp;title=Csharp%2FC_Sharp%2FThread%2FThread_Sync"/>
		<link rel="alternate" type="text/html" href="http://nfex.ru/index.php?title=Csharp/C_Sharp/Thread/Thread_Sync&amp;action=history"/>
		<updated>2026-04-30T04:02:49Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://nfex.ru/index.php?title=Csharp/C_Sharp/Thread/Thread_Sync&amp;diff=1067&amp;oldid=prev</id>
		<title> в 15:31, 26 мая 2010</title>
		<link rel="alternate" type="text/html" href="http://nfex.ru/index.php?title=Csharp/C_Sharp/Thread/Thread_Sync&amp;diff=1067&amp;oldid=prev"/>
				<updated>2010-05-26T15:31:19Z</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/C_Sharp/Thread/Thread_Sync&amp;diff=1068&amp;oldid=prev</id>
		<title>Admin: 1 версия</title>
		<link rel="alternate" type="text/html" href="http://nfex.ru/index.php?title=Csharp/C_Sharp/Thread/Thread_Sync&amp;diff=1068&amp;oldid=prev"/>
				<updated>2010-05-26T11:42:56Z</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;==Another way to use lock to synchronize access to an object==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
C#: The Complete Reference &lt;br /&gt;
by Herbert Schildt &lt;br /&gt;
Publisher: Osborne/McGraw-Hill (March 8, 2002)&lt;br /&gt;
ISBN: 0072134852&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
// Another way to use lock to synchronize access to an object.  &lt;br /&gt;
 &lt;br /&gt;
using System; &lt;br /&gt;
using System.Threading; &lt;br /&gt;
 &lt;br /&gt;
class SumArray {  &lt;br /&gt;
  int sum;  &lt;br /&gt;
  &lt;br /&gt;
  public int sumIt(int[] nums) {  &lt;br /&gt;
    sum = 0; // reset sum  &lt;br /&gt;
  &lt;br /&gt;
    for(int i=0; i &amp;lt; nums.Length; i++) {  &lt;br /&gt;
      sum += nums[i];  &lt;br /&gt;
      Console.WriteLine(&amp;quot;Running total for &amp;quot; +  &lt;br /&gt;
             Thread.CurrentThread.Name +  &lt;br /&gt;
             &amp;quot; is &amp;quot; + sum);  &lt;br /&gt;
      Thread.Sleep(10); // allow task-switch  &lt;br /&gt;
    }  &lt;br /&gt;
    return sum; &lt;br /&gt;
  }  &lt;br /&gt;
}   &lt;br /&gt;
  &lt;br /&gt;
class MyThread {  &lt;br /&gt;
  public Thread thrd;  &lt;br /&gt;
  int[] a;  &lt;br /&gt;
  int answer; &lt;br /&gt;
 &lt;br /&gt;
  /* Create one SumArray object for all &lt;br /&gt;
     instances of MyThread. */ &lt;br /&gt;
  static SumArray sa = new SumArray();  &lt;br /&gt;
 &lt;br /&gt;
  // Construct a new thread.  &lt;br /&gt;
  public MyThread(string name, int[] nums) {  &lt;br /&gt;
    a = nums;  &lt;br /&gt;
    thrd = new Thread(new ThreadStart(this.run)); &lt;br /&gt;
    thrd.Name = name; &lt;br /&gt;
    thrd.Start(); // start the thread  &lt;br /&gt;
  }  &lt;br /&gt;
  &lt;br /&gt;
  // Begin execution of new thread.  &lt;br /&gt;
  void run() {  &lt;br /&gt;
    Console.WriteLine(thrd.Name + &amp;quot; starting.&amp;quot;);  &lt;br /&gt;
  &lt;br /&gt;
    // Lock calls to sumIt().  &lt;br /&gt;
    lock(sa) answer = sa.sumIt(a); &lt;br /&gt;
 &lt;br /&gt;
    Console.WriteLine(&amp;quot;Sum for &amp;quot; + thrd.Name +  &lt;br /&gt;
                       &amp;quot; is &amp;quot; + answer);  &lt;br /&gt;
  &lt;br /&gt;
    Console.WriteLine(thrd.Name + &amp;quot; terminating.&amp;quot;);  &lt;br /&gt;
  }  &lt;br /&gt;
}  &lt;br /&gt;
  &lt;br /&gt;
public class Sync2 {  &lt;br /&gt;
  public static void Main() {  &lt;br /&gt;
    int[] a = {1, 2, 3, 4, 5};  &lt;br /&gt;
  &lt;br /&gt;
    MyThread mt1 = new MyThread(&amp;quot;Child #1&amp;quot;, a);  &lt;br /&gt;
    MyThread mt2 = new MyThread(&amp;quot;Child #2&amp;quot;, a);  &lt;br /&gt;
  &lt;br /&gt;
    mt1.thrd.Join();  &lt;br /&gt;
    mt2.thrd.Join();  &lt;br /&gt;
  }  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
           &lt;br /&gt;
       &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==A synchronized shared buffer implementation==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using System;&lt;br /&gt;
using System.Threading;&lt;br /&gt;
public class SynchronizedBuffer&lt;br /&gt;
{&lt;br /&gt;
   private int buffer = -1; &lt;br /&gt;
   private int occupiedBufferCount = 0;  &lt;br /&gt;
   public int Buffer&lt;br /&gt;
   {      &lt;br /&gt;
      get&lt;br /&gt;
      { &lt;br /&gt;
         Monitor.Enter( this );&lt;br /&gt;
         if ( occupiedBufferCount == 0 )&lt;br /&gt;
         {&lt;br /&gt;
            Console.WriteLine(Thread.CurrentThread.Name + &amp;quot; tries to read.&amp;quot; );&lt;br /&gt;
            DisplayState( &amp;quot;Buffer empty. &amp;quot; +Thread.CurrentThread.Name + &amp;quot; waits.&amp;quot; );&lt;br /&gt;
            Monitor.Wait( this );&lt;br /&gt;
         } &lt;br /&gt;
         --occupiedBufferCount;    &lt;br /&gt;
                              &lt;br /&gt;
         DisplayState( Thread.CurrentThread.Name + &amp;quot; reads &amp;quot; + buffer );&lt;br /&gt;
         Monitor.Pulse( this );&lt;br /&gt;
         int bufferCopy = buffer;&lt;br /&gt;
         Monitor.Exit( this );&lt;br /&gt;
         return bufferCopy;&lt;br /&gt;
      }&lt;br /&gt;
      set&lt;br /&gt;
      {&lt;br /&gt;
         Monitor.Enter( this );&lt;br /&gt;
         if ( occupiedBufferCount == 1 )&lt;br /&gt;
         {&lt;br /&gt;
            Console.WriteLine(Thread.CurrentThread.Name + &amp;quot; tries to write.&amp;quot; );&lt;br /&gt;
            DisplayState( &amp;quot;Buffer full. &amp;quot; + Thread.CurrentThread.Name + &amp;quot; waits.&amp;quot; );&lt;br /&gt;
            Monitor.Wait( this );&lt;br /&gt;
         }&lt;br /&gt;
         buffer = value;&lt;br /&gt;
         ++occupiedBufferCount;&lt;br /&gt;
         DisplayState( Thread.CurrentThread.Name + &amp;quot; writes &amp;quot; + buffer );&lt;br /&gt;
         Monitor.Pulse( this );&lt;br /&gt;
         Monitor.Exit( this );&lt;br /&gt;
      } &lt;br /&gt;
   }&lt;br /&gt;
   public void DisplayState( string operation )&lt;br /&gt;
   {&lt;br /&gt;
      Console.WriteLine( &amp;quot;{0,-35}{1,-9}{2}\n&amp;quot;,operation, buffer, occupiedBufferCount );&lt;br /&gt;
   }&lt;br /&gt;
   static void Main( string[] args )&lt;br /&gt;
   {&lt;br /&gt;
      SynchronizedBuffer shared = new SynchronizedBuffer();&lt;br /&gt;
      Random random = new Random();&lt;br /&gt;
      Console.WriteLine( &amp;quot;{0,-35}{1,-9}{2}\n&amp;quot;,&amp;quot;Operation&amp;quot;, &amp;quot;Buffer&amp;quot;, &amp;quot;Occupied Count&amp;quot; );&lt;br /&gt;
      shared.DisplayState( &amp;quot;Initial state&amp;quot; );&lt;br /&gt;
      Producer producer = new Producer( shared, random );&lt;br /&gt;
      Consumer consumer = new Consumer( shared, random );&lt;br /&gt;
      Thread producerThread = new Thread( new ThreadStart( producer.Produce ) );&lt;br /&gt;
      producerThread.Name = &amp;quot;Producer&amp;quot;;&lt;br /&gt;
      Thread consumerThread = new Thread( new ThreadStart( consumer.Consume ) );&lt;br /&gt;
      consumerThread.Name = &amp;quot;Consumer&amp;quot;;&lt;br /&gt;
      producerThread.Start();&lt;br /&gt;
      consumerThread.Start();&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
public class Consumer&lt;br /&gt;
{&lt;br /&gt;
   private SynchronizedBuffer sharedLocation;&lt;br /&gt;
   private Random randomSleepTime;&lt;br /&gt;
   public Consumer( SynchronizedBuffer shared, Random random )&lt;br /&gt;
   {&lt;br /&gt;
      sharedLocation = shared;&lt;br /&gt;
      randomSleepTime = random;&lt;br /&gt;
   }&lt;br /&gt;
   public void Consume()&lt;br /&gt;
   {&lt;br /&gt;
      int sum = 0;&lt;br /&gt;
      for ( int count = 1; count &amp;lt;= 10; count++ )&lt;br /&gt;
      {&lt;br /&gt;
         Thread.Sleep( randomSleepTime.Next( 1, 1001 ) );&lt;br /&gt;
         sum += sharedLocation.Buffer;&lt;br /&gt;
      }&lt;br /&gt;
      Console.WriteLine(&amp;quot;{0} read values totaling: {1}.\nTerminating {0}.&amp;quot;,Thread.CurrentThread.Name, sum );&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
public class Producer &lt;br /&gt;
{&lt;br /&gt;
   private SynchronizedBuffer sharedLocation;&lt;br /&gt;
   private Random randomSleepTime;&lt;br /&gt;
   public Producer( SynchronizedBuffer shared, Random random )&lt;br /&gt;
   {&lt;br /&gt;
      sharedLocation = shared;&lt;br /&gt;
      randomSleepTime = random;&lt;br /&gt;
   }&lt;br /&gt;
   public void Produce()&lt;br /&gt;
   {&lt;br /&gt;
      for ( int count = 1; count &amp;lt;= 10; count++ ) &lt;br /&gt;
      {&lt;br /&gt;
         Thread.Sleep( randomSleepTime.Next( 1, 1001 ) );&lt;br /&gt;
         sharedLocation.Buffer = count; &lt;br /&gt;
      }&lt;br /&gt;
      Console.WriteLine( &amp;quot;{0} done producing.\nTerminating {0}.&amp;quot;,Thread.CurrentThread.Name );&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
           &lt;br /&gt;
       &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Asynchronous Calls:A Simple Example 1==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
A Programmer&amp;quot;s Introduction to C# (Second Edition)&lt;br /&gt;
by Eric Gunnerson&lt;br /&gt;
Publisher: Apress  L.P.&lt;br /&gt;
ISBN: 1-893115-62-3&lt;br /&gt;
*/&lt;br /&gt;
// 29 - Threading and Asynchronous Operations\Asynchronous Calls\A Simple Example&lt;br /&gt;
// copyright 2000 Eric Gunnerson&lt;br /&gt;
using System;&lt;br /&gt;
&lt;br /&gt;
public class AsynchronousCallsASimpleExample&lt;br /&gt;
{&lt;br /&gt;
    public static void Main()&lt;br /&gt;
    {&lt;br /&gt;
        AsyncCaller ac = new AsyncCaller();&lt;br /&gt;
        ac.CallWriteLine(&amp;quot;Hello&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
public class AsyncCaller&lt;br /&gt;
{&lt;br /&gt;
    // Declare a delegate that will match Console.WriteLine(&amp;quot;string&amp;quot;);&lt;br /&gt;
    delegate void FuncToCall(string s);&lt;br /&gt;
    &lt;br /&gt;
    public void CallWriteLine(string s)&lt;br /&gt;
    {&lt;br /&gt;
        // delegate points to function to call&lt;br /&gt;
        // start the async call&lt;br /&gt;
        // wait for completion&lt;br /&gt;
        FuncToCall func = new FuncToCall(Console.WriteLine);&lt;br /&gt;
        IAsyncResult iar = func.BeginInvoke(s, null, null);&lt;br /&gt;
        func.EndInvoke(iar);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
           &lt;br /&gt;
       &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Asynchronous Calls:A Simple Example 2==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
A Programmer&amp;quot;s Introduction to C# (Second Edition)&lt;br /&gt;
by Eric Gunnerson&lt;br /&gt;
Publisher: Apress  L.P.&lt;br /&gt;
ISBN: 1-893115-62-3&lt;br /&gt;
*/&lt;br /&gt;
// 29 - Threading and Asynchronous Operations\Asynchronous Calls\A Simple Example&lt;br /&gt;
// copyright 2000 Eric Gunnerson&lt;br /&gt;
using System;&lt;br /&gt;
public class AsynchronousCallsASimpleExample2&lt;br /&gt;
{&lt;br /&gt;
    public static void Main()&lt;br /&gt;
    {&lt;br /&gt;
        AsyncCaller ac = new AsyncCaller();&lt;br /&gt;
        &lt;br /&gt;
        ac.CallWriteLineWithCallback(&amp;quot;Hello There&amp;quot;);&lt;br /&gt;
        &lt;br /&gt;
        System.Threading.Thread.Sleep(1000);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
public class AsyncCaller&lt;br /&gt;
{&lt;br /&gt;
    // Declare a delegate that will match Console.WriteLine(&amp;quot;string&amp;quot;);&lt;br /&gt;
    delegate void FuncToCall(string s);&lt;br /&gt;
    &lt;br /&gt;
    public void WriteLineCallback(IAsyncResult iar)&lt;br /&gt;
    {&lt;br /&gt;
        Console.WriteLine(&amp;quot;In WriteLineCallback&amp;quot;);&lt;br /&gt;
        FuncToCall func = (FuncToCall) iar.AsyncState;&lt;br /&gt;
        func.EndInvoke(iar);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public void CallWriteLineWithCallback(string s)&lt;br /&gt;
    {&lt;br /&gt;
        FuncToCall func = new FuncToCall(Console.WriteLine);&lt;br /&gt;
        func.BeginInvoke(s, &lt;br /&gt;
        new AsyncCallback(WriteLineCallback), &lt;br /&gt;
        func); // shows up as iar.AsyncState in callback&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
           &lt;br /&gt;
       &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Asynchronous Calls:Return Values==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
A Programmer&amp;quot;s Introduction to C# (Second Edition)&lt;br /&gt;
by Eric Gunnerson&lt;br /&gt;
Publisher: Apress  L.P.&lt;br /&gt;
ISBN: 1-893115-62-3&lt;br /&gt;
*/&lt;br /&gt;
// 29 - Threading and Asynchronous Operations\Asynchronous Calls\Return Values&lt;br /&gt;
// copyright 2000 Eric Gunnerson&lt;br /&gt;
using System;&lt;br /&gt;
using System.Threading;&lt;br /&gt;
&lt;br /&gt;
public class AsynchronousCallsReturnValues&lt;br /&gt;
{&lt;br /&gt;
    public static void Main()&lt;br /&gt;
    {&lt;br /&gt;
        AsyncCaller ac = new AsyncCaller();&lt;br /&gt;
        &lt;br /&gt;
        ac.CallMathCallback(new AsyncCaller.MathFunctionToCall(Math.Sin), 0.0, 1.0, 0.2);&lt;br /&gt;
        Thread.Sleep(2000);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
public class AsyncCaller&lt;br /&gt;
{&lt;br /&gt;
    public delegate double MathFunctionToCall(double arg);&lt;br /&gt;
    &lt;br /&gt;
    public void MathCallback(IAsyncResult iar)&lt;br /&gt;
    {&lt;br /&gt;
        MathFunctionToCall mc = (MathFunctionToCall) iar.AsyncState;&lt;br /&gt;
        double result = mc.EndInvoke(iar);&lt;br /&gt;
        Console.WriteLine(&amp;quot;Function value = {0}&amp;quot;, result);&lt;br /&gt;
    }&lt;br /&gt;
    public void CallMathCallback(MathFunctionToCall mathFunc,&lt;br /&gt;
    double start,&lt;br /&gt;
    double end,&lt;br /&gt;
    double increment)&lt;br /&gt;
    {&lt;br /&gt;
        AsyncCallback cb = new AsyncCallback(MathCallback);&lt;br /&gt;
        &lt;br /&gt;
        while (start &amp;lt; end)&lt;br /&gt;
        {    &lt;br /&gt;
            Console.WriteLine(&amp;quot;BeginInvoke: {0}&amp;quot;, start);&lt;br /&gt;
            mathFunc.BeginInvoke(start, cb, mathFunc);&lt;br /&gt;
            start += increment;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
           &lt;br /&gt;
       &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Asynchronous Calls:Waiting for Completion==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
A Programmer&amp;quot;s Introduction to C# (Second Edition)&lt;br /&gt;
by Eric Gunnerson&lt;br /&gt;
Publisher: Apress  L.P.&lt;br /&gt;
ISBN: 1-893115-62-3&lt;br /&gt;
*/&lt;br /&gt;
// 29 - Threading and Asynchronous Operations\Asynchronous Calls\Waiting for Completion&lt;br /&gt;
// copyright 2000 Eric Gunnerson&lt;br /&gt;
using System;&lt;br /&gt;
using System.Threading;&lt;br /&gt;
&lt;br /&gt;
public class AsynchronousCallsWaitingforCompletion1&lt;br /&gt;
{&lt;br /&gt;
    public static double DoCalculation(double value)&lt;br /&gt;
    {&lt;br /&gt;
        Console.WriteLine(&amp;quot;DoCalculation: {0}&amp;quot;, value);&lt;br /&gt;
        Thread.Sleep(250);&lt;br /&gt;
        return(Math.Cos(value));&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void Main()&lt;br /&gt;
    {&lt;br /&gt;
        AsyncCaller ac = new AsyncCaller();&lt;br /&gt;
        &lt;br /&gt;
        ac.CallMathCallback(new AsyncCaller.MathFunctionToCall(DoCalculation));&lt;br /&gt;
        //Thread.Sleep(500);        // no longer needed&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
public class AsyncCaller&lt;br /&gt;
{&lt;br /&gt;
    public delegate double MathFunctionToCall(double arg);&lt;br /&gt;
    &lt;br /&gt;
    public void MathCallback(IAsyncResult iar)&lt;br /&gt;
    {&lt;br /&gt;
        MathFunctionToCall mc = (MathFunctionToCall) iar.AsyncState;&lt;br /&gt;
        double result = mc.EndInvoke(iar);&lt;br /&gt;
        Console.WriteLine(&amp;quot;Function value = {0}&amp;quot;, result);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    WaitHandle DoInvoke(MathFunctionToCall mathFunc, double value)&lt;br /&gt;
    {&lt;br /&gt;
        AsyncCallback cb = new AsyncCallback(MathCallback);&lt;br /&gt;
        &lt;br /&gt;
        IAsyncResult asyncResult = &lt;br /&gt;
        mathFunc.BeginInvoke(value, cb, mathFunc);&lt;br /&gt;
        return(asyncResult.AsyncWaitHandle);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public void CallMathCallback(MathFunctionToCall mathFunc)&lt;br /&gt;
    {&lt;br /&gt;
        WaitHandle[] waitArray = new WaitHandle[4];&lt;br /&gt;
        &lt;br /&gt;
        Console.WriteLine(&amp;quot;Begin Invoke&amp;quot;);&lt;br /&gt;
        waitArray[0] = DoInvoke(mathFunc, 0.1);&lt;br /&gt;
        waitArray[1] = DoInvoke(mathFunc, 0.5);&lt;br /&gt;
        waitArray[2] = DoInvoke(mathFunc, 1.0);&lt;br /&gt;
        waitArray[3] = DoInvoke(mathFunc, 3.14159);&lt;br /&gt;
        Console.WriteLine(&amp;quot;Begin Invoke Done&amp;quot;);&lt;br /&gt;
        &lt;br /&gt;
        Console.WriteLine(&amp;quot;Waiting for completion&amp;quot;);&lt;br /&gt;
        WaitHandle.WaitAll(waitArray, 10000, false);&lt;br /&gt;
        Console.WriteLine(&amp;quot;Completion achieved&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
           &lt;br /&gt;
       &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Asynchronous Calls:Waiting for Completion 2==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
A Programmer&amp;quot;s Introduction to C# (Second Edition)&lt;br /&gt;
by Eric Gunnerson&lt;br /&gt;
Publisher: Apress  L.P.&lt;br /&gt;
ISBN: 1-893115-62-3&lt;br /&gt;
*/&lt;br /&gt;
// 29 - Threading and Asynchronous Operations\Asynchronous Calls\Waiting for Completion&lt;br /&gt;
// copyright 2000 Eric Gunnerson&lt;br /&gt;
using System;&lt;br /&gt;
using System.Threading;&lt;br /&gt;
&lt;br /&gt;
public class AsynchronousCallsWaitingforCompletion2&lt;br /&gt;
{&lt;br /&gt;
    public static double DoCalculation(double value)&lt;br /&gt;
    {&lt;br /&gt;
        Console.WriteLine(&amp;quot;DoCalculation: {0}&amp;quot;, value);&lt;br /&gt;
        Thread.Sleep(250);&lt;br /&gt;
        return(Math.Cos(value));&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void Main()&lt;br /&gt;
    {&lt;br /&gt;
        AsyncCaller ac = new AsyncCaller();&lt;br /&gt;
        &lt;br /&gt;
        ac.CallMathCallback(new AsyncCaller.MathFunctionToCall(DoCalculation));&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
public class AsyncCallTracker&lt;br /&gt;
{&lt;br /&gt;
    Delegate function;&lt;br /&gt;
    AutoResetEvent doneEvent;&lt;br /&gt;
    &lt;br /&gt;
    public AutoResetEvent DoneEvent&lt;br /&gt;
    {&lt;br /&gt;
        get&lt;br /&gt;
        {&lt;br /&gt;
            return(doneEvent);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public Delegate Function&lt;br /&gt;
    {&lt;br /&gt;
        get&lt;br /&gt;
        {&lt;br /&gt;
            return(function);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public AsyncCallTracker(Delegate function)&lt;br /&gt;
    {&lt;br /&gt;
        this.function = function;&lt;br /&gt;
        doneEvent = new AutoResetEvent(false);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
public class AsyncCaller&lt;br /&gt;
{&lt;br /&gt;
    public delegate double MathFunctionToCall(double arg);&lt;br /&gt;
    &lt;br /&gt;
    public void MathCallback(IAsyncResult iar)&lt;br /&gt;
    {&lt;br /&gt;
        AsyncCallTracker callTracker = (AsyncCallTracker) iar.AsyncState;&lt;br /&gt;
        MathFunctionToCall func = (MathFunctionToCall) callTracker.Function;&lt;br /&gt;
        double result = func.EndInvoke(iar);&lt;br /&gt;
        Console.WriteLine(&amp;quot;Function value = {0}&amp;quot;, result);&lt;br /&gt;
        callTracker.DoneEvent.Set();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    WaitHandle DoInvoke(MathFunctionToCall mathFunc, double value)&lt;br /&gt;
    {&lt;br /&gt;
        AsyncCallTracker callTracker = new AsyncCallTracker(mathFunc);&lt;br /&gt;
        &lt;br /&gt;
        AsyncCallback cb = new AsyncCallback(MathCallback);&lt;br /&gt;
        IAsyncResult asyncResult = mathFunc.BeginInvoke(value, cb, callTracker);&lt;br /&gt;
        return(callTracker.DoneEvent);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public void CallMathCallback(MathFunctionToCall mathFunc)&lt;br /&gt;
    {&lt;br /&gt;
        WaitHandle[] waitArray = new WaitHandle[4];&lt;br /&gt;
        &lt;br /&gt;
        Console.WriteLine(&amp;quot;Begin Invoke&amp;quot;);&lt;br /&gt;
        waitArray[0] = DoInvoke(mathFunc, 0.1);&lt;br /&gt;
        waitArray[1] = DoInvoke(mathFunc, 0.5);&lt;br /&gt;
        waitArray[2] = DoInvoke(mathFunc, 1.0);&lt;br /&gt;
        waitArray[3] = DoInvoke(mathFunc, 3.14159);&lt;br /&gt;
        Console.WriteLine(&amp;quot;Begin Invoke Done&amp;quot;);&lt;br /&gt;
        &lt;br /&gt;
        Console.WriteLine(&amp;quot;Waiting for completion&amp;quot;);&lt;br /&gt;
        WaitHandle.WaitAll(waitArray, 10000, false);&lt;br /&gt;
        Console.WriteLine(&amp;quot;Completion achieved&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
           &lt;br /&gt;
       &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Data Protection and Synchronization:A Slightly Broken Example==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
A Programmer&amp;quot;s Introduction to C# (Second Edition)&lt;br /&gt;
by Eric Gunnerson&lt;br /&gt;
Publisher: Apress  L.P.&lt;br /&gt;
ISBN: 1-893115-62-3&lt;br /&gt;
*/&lt;br /&gt;
// 29 - Threading and Asynchronous Operations\Data Protection and Synchronization\A Slightly Broken Example&lt;br /&gt;
// copyright 2000 Eric Gunnerson&lt;br /&gt;
using System;&lt;br /&gt;
using System.Threading;&lt;br /&gt;
class Val&lt;br /&gt;
{&lt;br /&gt;
    int number = 1;&lt;br /&gt;
    &lt;br /&gt;
    public void Bump()&lt;br /&gt;
    {&lt;br /&gt;
        int temp = number;&lt;br /&gt;
        number = temp + 2;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public override string ToString()&lt;br /&gt;
    {&lt;br /&gt;
        return(number.ToString());&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public void DoBump()&lt;br /&gt;
    {&lt;br /&gt;
        for (int i = 0; i &amp;lt; 5; i++)&lt;br /&gt;
        {&lt;br /&gt;
            Bump();&lt;br /&gt;
            Console.WriteLine(&amp;quot;number = {0}&amp;quot;, number);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
public class DataProtectionandSynchronizationASlightlyBrokenExample&lt;br /&gt;
{&lt;br /&gt;
    public static void Main()&lt;br /&gt;
    {&lt;br /&gt;
        Val v = new Val();&lt;br /&gt;
        &lt;br /&gt;
        for (int threadNum = 0; threadNum &amp;lt; 5; threadNum++)&lt;br /&gt;
        {&lt;br /&gt;
            Thread thread = new Thread(new ThreadStart(v.DoBump));&lt;br /&gt;
            thread.Start();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
           &lt;br /&gt;
       &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==illustrates the use of the Mutex object==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
Mastering Visual C# .NET&lt;br /&gt;
by Jason Price, Mike Gunderloy&lt;br /&gt;
Publisher: Sybex;&lt;br /&gt;
ISBN: 0782129110&lt;br /&gt;
*/&lt;br /&gt;
/*&lt;br /&gt;
  Example14_11.cs illustrates the use of the Mutex object&lt;br /&gt;
*/&lt;br /&gt;
using System;&lt;br /&gt;
using System.Threading;&lt;br /&gt;
public class Example14_11 &lt;br /&gt;
{&lt;br /&gt;
  // a shared counter&lt;br /&gt;
  private static int Runs = 0;&lt;br /&gt;
  // a mutex&lt;br /&gt;
  static Mutex mtx;&lt;br /&gt;
  // the CountUp method increments the shared counter&lt;br /&gt;
  public static void CountUp() &lt;br /&gt;
  {&lt;br /&gt;
    while (Runs &amp;lt; 10)&lt;br /&gt;
    {&lt;br /&gt;
      // acquire the mutex&lt;br /&gt;
      mtx.WaitOne();&lt;br /&gt;
      int Temp = Runs;&lt;br /&gt;
      Temp++;&lt;br /&gt;
      Console.WriteLine(Thread.CurrentThread.Name + &amp;quot; &amp;quot; + Temp);&lt;br /&gt;
      Thread.Sleep(1000);&lt;br /&gt;
      Runs = Temp;&lt;br /&gt;
      // release the mutex&lt;br /&gt;
      mtx.ReleaseMutex();&lt;br /&gt;
    } &lt;br /&gt;
  }&lt;br /&gt;
  public static void Main() &lt;br /&gt;
  {&lt;br /&gt;
    // create the mutex&lt;br /&gt;
    mtx = new Mutex(false, &amp;quot;RunsMutex&amp;quot;);&lt;br /&gt;
    // create and launch two threads&lt;br /&gt;
    Thread t2 = new Thread(new ThreadStart(CountUp));&lt;br /&gt;
    t2.Name = &amp;quot;t2&amp;quot;;&lt;br /&gt;
    Thread t3 = new Thread(new ThreadStart(CountUp));&lt;br /&gt;
    t3.Name = &amp;quot;t3&amp;quot;;&lt;br /&gt;
    t2.Start();&lt;br /&gt;
    t3.Start();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
           &lt;br /&gt;
       &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==My Main Class Async Call back==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 * C# Programmers Pocket Consultant&lt;br /&gt;
 * Author: Gregory S. MacBeth&lt;br /&gt;
 * Email: gmacbeth@comporium.net&lt;br /&gt;
 * Create Date: June 27, 2003&lt;br /&gt;
 * Last Modified Date:&lt;br /&gt;
 * Version: 1&lt;br /&gt;
 */&lt;br /&gt;
using System;&lt;br /&gt;
using System.Threading;&lt;br /&gt;
using System.Runtime.Remoting.Messaging;&lt;br /&gt;
namespace Client.Chapter_15___Threading&lt;br /&gt;
{&lt;br /&gt;
  public class MyMainClassAsyncCallback&lt;br /&gt;
  {&lt;br /&gt;
    delegate int MyDelegate(string s, ref int a, ref int b);&lt;br /&gt;
    static void Main(string[] args)&lt;br /&gt;
    {&lt;br /&gt;
      MyDelegate X = new MyDelegate(DoSomething);&lt;br /&gt;
      int a = 0;&lt;br /&gt;
      int b = 0;&lt;br /&gt;
      //Making Async Call that calls a callback when finished&lt;br /&gt;
      AsyncCallback cb = new AsyncCallback(DoSomething2);&lt;br /&gt;
      IAsyncResult ar = X.BeginInvoke(&amp;quot;Hello&amp;quot;, ref a, ref b, cb, null);&lt;br /&gt;
      Console.ReadLine();&lt;br /&gt;
    }&lt;br /&gt;
    //My Async Method&lt;br /&gt;
    static int DoSomething(string s, ref int a, ref int b)&lt;br /&gt;
    {&lt;br /&gt;
      a = 10;&lt;br /&gt;
      b = 100;&lt;br /&gt;
      Console.WriteLine(&amp;quot;Fired! DoSomething1&amp;quot;);&lt;br /&gt;
      return 0;&lt;br /&gt;
    }&lt;br /&gt;
    //Mycallback method when finished running DoSomehting&lt;br /&gt;
    static void DoSomething2(IAsyncResult ar)&lt;br /&gt;
    {&lt;br /&gt;
      int a = 0;&lt;br /&gt;
      int b = 0;&lt;br /&gt;
      Console.WriteLine(&amp;quot;Fired! DoSomething2&amp;quot;);&lt;br /&gt;
      //Get the delegate&lt;br /&gt;
      MyDelegate X = (MyDelegate)((AsyncResult)ar).AsyncDelegate;&lt;br /&gt;
      //get results&lt;br /&gt;
      X.EndInvoke(ref a, ref b, ar);&lt;br /&gt;
      Console.WriteLine(a);&lt;br /&gt;
      Console.WriteLine(b);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
           &lt;br /&gt;
       &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==MyMain Class Async Wait Timeout==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 * C# Programmers Pocket Consultant&lt;br /&gt;
 * Author: Gregory S. MacBeth&lt;br /&gt;
 * Email: gmacbeth@comporium.net&lt;br /&gt;
 * Create Date: June 27, 2003&lt;br /&gt;
 * Last Modified Date:&lt;br /&gt;
 * Version: 1&lt;br /&gt;
 */&lt;br /&gt;
using System;&lt;br /&gt;
using System.Runtime.Remoting.Messaging;&lt;br /&gt;
namespace Client.Chapter_15___Threading&lt;br /&gt;
{&lt;br /&gt;
  public class MyMainClassAsyncWaitTimeout&lt;br /&gt;
  {&lt;br /&gt;
    delegate int MyDelegate(string s, ref int a, ref int b);&lt;br /&gt;
    static void Main(string[] args)&lt;br /&gt;
    {&lt;br /&gt;
      MyDelegate X = new MyDelegate(DoSomething);&lt;br /&gt;
      int a = 0;&lt;br /&gt;
      int b = 0;&lt;br /&gt;
      IAsyncResult ar = X.BeginInvoke(&amp;quot;Hello&amp;quot;, ref a, ref b, null, null);&lt;br /&gt;
      ar.AsyncWaitHandle.WaitOne(10000, false);&lt;br /&gt;
      if (ar.IsCompleted)&lt;br /&gt;
      {&lt;br /&gt;
        int c = 0;&lt;br /&gt;
        int d = 0;&lt;br /&gt;
        //get results&lt;br /&gt;
        X.EndInvoke(ref c, ref d, ar);&lt;br /&gt;
        Console.WriteLine(c);&lt;br /&gt;
        Console.WriteLine(d);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    //My Async Method&lt;br /&gt;
    static int DoSomething(string s, ref int a, ref int b)&lt;br /&gt;
    {&lt;br /&gt;
      a = 10;&lt;br /&gt;
      b = 100;&lt;br /&gt;
      Console.WriteLine(&amp;quot;Fired! DoSomething1&amp;quot;);&lt;br /&gt;
      return 0;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
           &lt;br /&gt;
       &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Threading and Asynchronous Operations:Access Reordering and Volatile==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
A Programmer&amp;quot;s Introduction to C# (Second Edition)&lt;br /&gt;
by Eric Gunnerson&lt;br /&gt;
Publisher: Apress  L.P.&lt;br /&gt;
ISBN: 1-893115-62-3&lt;br /&gt;
*/&lt;br /&gt;
// 29 - Threading and Asynchronous Operations\Access Reordering and Volatile&lt;br /&gt;
// copyright 2000 Eric Gunnerson&lt;br /&gt;
using System;&lt;br /&gt;
using System.Threading;&lt;br /&gt;
class Problem&lt;br /&gt;
{&lt;br /&gt;
    int x;&lt;br /&gt;
    int y;&lt;br /&gt;
    int curx;&lt;br /&gt;
    int cury;&lt;br /&gt;
    &lt;br /&gt;
    public Problem()&lt;br /&gt;
    {&lt;br /&gt;
        x = 0;&lt;br /&gt;
        y = 0;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public void Process1()&lt;br /&gt;
    {&lt;br /&gt;
        x = 1;&lt;br /&gt;
        cury = y;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public void Process2()&lt;br /&gt;
    {&lt;br /&gt;
        y = 1;&lt;br /&gt;
        curx = x;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public void TestCurrent()&lt;br /&gt;
    {&lt;br /&gt;
        Console.WriteLine(&amp;quot;curx, cury: {0} {1}&amp;quot;, curx, cury);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
public class AccessReorderingandVolatile&lt;br /&gt;
{&lt;br /&gt;
    public static void Main()&lt;br /&gt;
    {&lt;br /&gt;
        Problem p = new Problem();&lt;br /&gt;
        &lt;br /&gt;
        Thread t1 = new Thread(new ThreadStart(p.Process1));        &lt;br /&gt;
        Thread t2 = new Thread(new ThreadStart(p.Process2));        &lt;br /&gt;
        t1.Start();&lt;br /&gt;
        t2.Start();&lt;br /&gt;
        &lt;br /&gt;
        t1.Join();&lt;br /&gt;
        t2.Join();&lt;br /&gt;
        &lt;br /&gt;
        p.TestCurrent();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
           &lt;br /&gt;
       &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Threading Class Mutex==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 * C# Programmers Pocket Consultant&lt;br /&gt;
 * Author: Gregory S. MacBeth&lt;br /&gt;
 * Email: gmacbeth@comporium.net&lt;br /&gt;
 * Create Date: June 27, 2003&lt;br /&gt;
 * Last Modified Date:&lt;br /&gt;
 * Version: 1&lt;br /&gt;
 */&lt;br /&gt;
using System;&lt;br /&gt;
using System.Collections;&lt;br /&gt;
using System.Threading;&lt;br /&gt;
namespace Client.Chapter_15___Threading&lt;br /&gt;
{&lt;br /&gt;
  public class ThreadingClassMutex&lt;br /&gt;
  {&lt;br /&gt;
    public static Thread ThreadOne = new Thread(new ThreadStart(MutexExample));&lt;br /&gt;
    public static ArrayList MyList = new ArrayList();&lt;br /&gt;
    private static Mutex MyMutex = new Mutex(false, &amp;quot;MyMutex&amp;quot;);&lt;br /&gt;
    public ThreadingClassMutex()&lt;br /&gt;
    {&lt;br /&gt;
      MyList.Add(&amp;quot;Test1&amp;quot;);&lt;br /&gt;
      MyList.Add(&amp;quot;Test2&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    static void Main(string[] args)&lt;br /&gt;
    {&lt;br /&gt;
      ThreadOne.Start();&lt;br /&gt;
    }&lt;br /&gt;
    protected static void MutexExample()&lt;br /&gt;
    {&lt;br /&gt;
      MyMutex.WaitOne();&lt;br /&gt;
      MyList.Add(&amp;quot;Test3&amp;quot;);&lt;br /&gt;
      MyMutex.ReleaseMutex();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
           &lt;br /&gt;
       &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Use lock to synchronize access to an object==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
C#: The Complete Reference &lt;br /&gt;
by Herbert Schildt &lt;br /&gt;
Publisher: Osborne/McGraw-Hill (March 8, 2002)&lt;br /&gt;
ISBN: 0072134852&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
// Use lock to synchronize access to an object.  &lt;br /&gt;
 &lt;br /&gt;
using System; &lt;br /&gt;
using System.Threading; &lt;br /&gt;
 &lt;br /&gt;
class SumArray {  &lt;br /&gt;
  int sum;  &lt;br /&gt;
  &lt;br /&gt;
  public int sumIt(int[] nums) {  &lt;br /&gt;
    lock(this) { // lock the entire method &lt;br /&gt;
      sum = 0; // reset sum  &lt;br /&gt;
    &lt;br /&gt;
      for(int i=0; i &amp;lt; nums.Length; i++) {  &lt;br /&gt;
        sum += nums[i];  &lt;br /&gt;
        Console.WriteLine(&amp;quot;Running total for &amp;quot; +  &lt;br /&gt;
               Thread.CurrentThread.Name +  &lt;br /&gt;
               &amp;quot; is &amp;quot; + sum);  &lt;br /&gt;
        Thread.Sleep(10); // allow task-switch  &lt;br /&gt;
      }  &lt;br /&gt;
      return sum; &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;
  int[] a;  &lt;br /&gt;
  int answer; &lt;br /&gt;
 &lt;br /&gt;
  /* Create one SumArray object for all &lt;br /&gt;
     instances of MyThread. */ &lt;br /&gt;
  static SumArray sa = new SumArray();  &lt;br /&gt;
 &lt;br /&gt;
  // Construct a new thread.  &lt;br /&gt;
  public MyThread(string name, int[] nums) {  &lt;br /&gt;
    a = nums;  &lt;br /&gt;
    thrd = new Thread(new ThreadStart(this.run)); &lt;br /&gt;
    thrd.Name = name; &lt;br /&gt;
    thrd.Start(); // start the thread  &lt;br /&gt;
  }  &lt;br /&gt;
  &lt;br /&gt;
  // Begin execution of new thread.  &lt;br /&gt;
  void run() {  &lt;br /&gt;
    Console.WriteLine(thrd.Name + &amp;quot; starting.&amp;quot;);  &lt;br /&gt;
  &lt;br /&gt;
    answer = sa.sumIt(a);           &lt;br /&gt;
 &lt;br /&gt;
    Console.WriteLine(&amp;quot;Sum for &amp;quot; + thrd.Name +  &lt;br /&gt;
                       &amp;quot; is &amp;quot; + answer);  &lt;br /&gt;
  &lt;br /&gt;
    Console.WriteLine(thrd.Name + &amp;quot; terminating.&amp;quot;);  &lt;br /&gt;
  }  &lt;br /&gt;
}  &lt;br /&gt;
  &lt;br /&gt;
public class Sync {  &lt;br /&gt;
  public static void Main() {  &lt;br /&gt;
    int[] a = {1, 2, 3, 4, 5};  &lt;br /&gt;
  &lt;br /&gt;
    MyThread mt1 = new MyThread(&amp;quot;Child #1&amp;quot;, a);  &lt;br /&gt;
    MyThread mt2 = new MyThread(&amp;quot;Child #2&amp;quot;, a);  &lt;br /&gt;
  &lt;br /&gt;
    mt1.thrd.Join();  &lt;br /&gt;
    mt2.thrd.Join();  &lt;br /&gt;
  }  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
           &lt;br /&gt;
       &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Use MethodImplAttribute to synchronize a method==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
C#: The Complete Reference &lt;br /&gt;
by Herbert Schildt &lt;br /&gt;
Publisher: Osborne/McGraw-Hill (March 8, 2002)&lt;br /&gt;
ISBN: 0072134852&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
// Use MethodImplAttribute to synchronize a method. &lt;br /&gt;
 &lt;br /&gt;
using System; &lt;br /&gt;
using System.Threading; &lt;br /&gt;
using System.Runtime.rupilerServices; &lt;br /&gt;
 &lt;br /&gt;
class TickTock { &lt;br /&gt;
 &lt;br /&gt;
  /* The following attribute synchronizes the entire &lt;br /&gt;
     tick() method. */ &lt;br /&gt;
  [MethodImplAttribute(MethodImplOptions.Synchronized)] &lt;br /&gt;
  public void tick(bool running) { &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;
   &lt;br /&gt;
    Monitor.Wait(this); // wait for tock() to complete &lt;br /&gt;
  } &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
  /* The following attribute synchronizes the entire &lt;br /&gt;
     tock() method. */ &lt;br /&gt;
  [MethodImplAttribute(MethodImplOptions.Synchronized)] &lt;br /&gt;
  public void tock(bool running) { &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(new ThreadStart(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;
public class TickingClock1 { &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;
}&lt;br /&gt;
&lt;br /&gt;
           &lt;br /&gt;
       &amp;lt;/source&amp;gt;&lt;br /&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;
   &lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
C#: The Complete Reference &lt;br /&gt;
by Herbert Schildt &lt;br /&gt;
Publisher: Osborne/McGraw-Hill (March 8, 2002)&lt;br /&gt;
ISBN: 0072134852&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
// Use Wait() and Pulse() to create a ticking clock. &lt;br /&gt;
 &lt;br /&gt;
using System; &lt;br /&gt;
using System.Threading; &lt;br /&gt;
 &lt;br /&gt;
class TickTock { &lt;br /&gt;
 &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;
   &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(new ThreadStart(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;
public 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;
}&lt;br /&gt;
&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>