Asynchronous Calls:Waiting for Completion 2
/*
A Programmer's Introduction to C# (Second Edition)
by Eric Gunnerson
Publisher: Apress L.P.
ISBN: 1-893115-62-3
*/
// 29 - Threading and Asynchronous Operations\Asynchronous Calls\Waiting for Completion
// copyright 2000 Eric Gunnerson
using System;
using System.Threading;
public class AsynchronousCallsWaitingforCompletion2
{
public static double DoCalculation(double value)
{
Console.WriteLine("DoCalculation: {0}", value);
Thread.Sleep(250);
return(Math.Cos(value));
}
public static void Main()
{
AsyncCaller ac = new AsyncCaller();
ac.CallMathCallback(new AsyncCaller.MathFunctionToCall(DoCalculation));
}
}
public class AsyncCallTracker
{
Delegate function;
AutoResetEvent doneEvent;
public AutoResetEvent DoneEvent
{
get
{
return(doneEvent);
}
}
public Delegate Function
{
get
{
return(function);
}
}
public AsyncCallTracker(Delegate function)
{
this.function = function;
doneEvent = new AutoResetEvent(false);
}
}
public class AsyncCaller
{
public delegate double MathFunctionToCall(double arg);
public void MathCallback(IAsyncResult iar)
{
AsyncCallTracker callTracker = (AsyncCallTracker) iar.AsyncState;
MathFunctionToCall func = (MathFunctionToCall) callTracker.Function;
double result = func.EndInvoke(iar);
Console.WriteLine("Function value = {0}", result);
callTracker.DoneEvent.Set();
}
WaitHandle DoInvoke(MathFunctionToCall mathFunc, double value)
{
AsyncCallTracker callTracker = new AsyncCallTracker(mathFunc);
AsyncCallback cb = new AsyncCallback(MathCallback);
IAsyncResult asyncResult = mathFunc.BeginInvoke(value, cb, callTracker);
return(callTracker.DoneEvent);
}
public void CallMathCallback(MathFunctionToCall mathFunc)
{
WaitHandle[] waitArray = new WaitHandle[4];
Console.WriteLine("Begin Invoke");
waitArray[0] = DoInvoke(mathFunc, 0.1);
waitArray[1] = DoInvoke(mathFunc, 0.5);
waitArray[2] = DoInvoke(mathFunc, 1.0);
waitArray[3] = DoInvoke(mathFunc, 3.14159);
Console.WriteLine("Begin Invoke Done");
Console.WriteLine("Waiting for completion");
WaitHandle.WaitAll(waitArray, 10000, false);
Console.WriteLine("Completion achieved");
}
}
Related examples in the same category