/*
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 AsynchronousCallsWaitingforCompletion1
{
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));
//Thread.Sleep(500); // no longer needed
}
}
public class AsyncCaller
{
public delegate double MathFunctionToCall(double arg);
public void MathCallback(IAsyncResult iar)
{
MathFunctionToCall mc = (MathFunctionToCall) iar.AsyncState;
double result = mc.EndInvoke(iar);
Console.WriteLine("Function value = {0}", result);
}
WaitHandle DoInvoke(MathFunctionToCall mathFunc, double value)
{
AsyncCallback cb = new AsyncCallback(MathCallback);
IAsyncResult asyncResult =
mathFunc.BeginInvoke(value, cb, mathFunc);
return(asyncResult.AsyncWaitHandle);
}
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");
}
}
|