using System; using System.Threading; namespace AsyncCallbacks { class AsyncTest { [STAThread] static void Main(string[] args) { AsyncTest test = new AsyncTest(); test.Run(); Console.WriteLine(); test.Run(); Console.WriteLine(); Console.WriteLine("Press to exit."); Console.WriteLine(); Console.ReadLine(); } private delegate void DoSomethingDelegate(); private int startTicks; private DoSomethingDelegate m_delegate; private AsyncCallback m_callback; AsyncTest() { m_delegate = new DoSomethingDelegate(this.DoSomething); m_callback = new AsyncCallback(this.CompletionProc); startTicks = Environment.TickCount; } string Time { get { return (Environment.TickCount - startTicks).ToString() + " ms"; } } void Run() { Console.WriteLine("About to call DoSomething at " + Time); IAsyncResult iar = m_delegate.BeginInvoke(m_callback, null); iar.AsyncWaitHandle.WaitOne(); // you will get here as soon as DoSomething() finishes, but // potentially before CompletionProc() has run Console.WriteLine("WaitOne finished at " + Time); Thread.Sleep(1200); } void DoSomething() { Console.WriteLine("Enter DoSomething at " + Time); Thread.Sleep(1000); Console.WriteLine("Exit DoSomething at " + Time); } void CompletionProc(IAsyncResult iar) { Console.WriteLine("Enter CompletionProc at " + Time); Thread.Sleep(1000); m_delegate.EndInvoke(iar); Console.WriteLine("Exit CompletionProc at " + Time); } } }