using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ComponentModel; using System.Threading; namespace AsyncProgramDemo { public class AsyncComponentSample : Component { public event Action<object, BreakEventArgs> Break; public event Action<object, DebugCompltedEventArgs> Completed; public void StartDebug() { AsyncOperation asyncOp = AsyncOperationManager.CreateOperation(1); Action<AsyncOperation> exec = new Action<AsyncOperation>(Execute); exec.BeginInvoke(asyncOp, null, null); } private void Execute(AsyncOperation asyncOp) { Thread.Sleep(1000); SendOrPostCallback callback = new SendOrPostCallback(Callback); asyncOp.Post(callback, 7); Thread.Sleep(1000); SendOrPostCallback completedCallback = new SendOrPostCallback(CompltedCallback); asyncOp.PostOperationCompleted(completedCallback, "completed"); } private void Callback(object lineNumber) { if (Break != null) { Break(this, new BreakEventArgs((int)lineNumber)); } } private void CompltedCallback(object msg) { if (Completed != null) { Completed(this, new DebugCompltedEventArgs(msg.ToString())); } } } public class BreakEventArgs : EventArgs { public int LineNumber; public BreakEventArgs(int lineNumber) { this.LineNumber = lineNumber; } } public class DebugCompltedEventArgs : AsyncCompletedEventArgs { public string Msg; public DebugCompltedEventArgs(string msg) : base(null, false, null) { this.Msg = msg; } } }