1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading; 6 using System.Runtime.Remoting.Messaging; 7 8 namespace ThreadExample 9 { 10 class Program 11 { 12 delegate string MyDelegate(string msg); 13 static object locker=new object(); 14 15 static void Main(string[] args) 16 { 17 WriteLine("Main Thread Begin ,ThreadId is : " + Thread.CurrentThread.ManagedThreadId, ConsoleColor.Green); 18 MyDelegate myDelegate = new MyDelegate(Messgae); 19 //异步调用,传入参数为object类型,此处用stirng示例 20 myDelegate.BeginInvoke("Hello Thread World!", Completed, "传参示例"); 21 //模拟线程工作,可以看到两线程同时工作 22 for (int i = 0; i < 5; i++) 23 { 24 Thread.Sleep(1000); 25 WriteLine("Main Thread Works!", ConsoleColor.Green); 26 } 27 WriteLine("Main Thread Complete!", ConsoleColor.Green); 28 Console.ReadKey(); 29 } 30 31 static string Messgae(string msg) 32 { 33 WriteLine("Async Thread Begin ,ThreadId is : " + Thread.CurrentThread.ManagedThreadId, ConsoleColor.Red); 34 //模拟线程工作,可以看到两线程同时工作 35 for (int i = 0; i < 5; i++) 36 { 37 Thread.Sleep(500); 38 WriteLine("Async Thread Works!", ConsoleColor.Red); 39 } 40 WriteLine("Async Thread Complete!", ConsoleColor.Red); 41 return msg; 42 } 43 44 static void Completed(IAsyncResult iresult) 45 { 46 //通过 Thread.CurrentThread.ManagedThreadId 可以看出,回调函数运行在异步线程上 47 WriteLine("Async Thread CallBack Begin,ThreadId is : " + Thread.CurrentThread.ManagedThreadId, ConsoleColor.Cyan); 48 AsyncResult result = iresult as AsyncResult; 49 //使用AsyncDelegate获得委托 50 MyDelegate myDelegate = result.AsyncDelegate as MyDelegate; 51 //使用EndInvoke获取返回值 52 string data = myDelegate.EndInvoke(result); 53 //用 AsyncState 获得传入的参数(即19行“传参示例”四个字) 54 string asyncState = result.AsyncState.ToString(); 55 WriteLine(data, ConsoleColor.Cyan); 56 WriteLine(asyncState, ConsoleColor.Cyan); 57 //模拟回调函数工作 58 for (int i = 0; i < 3; i++) 59 { 60 Thread.Sleep(500); 61 WriteLine("Async Thread CallBack Works!", ConsoleColor.Cyan); 62 } 63 WriteLine("Async Thread CallBack Complete!", ConsoleColor.Cyan); 64 } 65 66 static void WriteLine(string data, ConsoleColor color) 67 { 68 lock (locker) 69 { 70 Console.ForegroundColor = color; 71 Console.WriteLine(data); 72 Console.ResetColor(); 73 } 74 } 75 } 76 }
结果: