其实这也是面试中被问倒的问题:(贴在这里纪念一下,注:只是简单的罗列,详细原理及分析,请参阅《CLR Via c#》第三版相关章节)1、利用线程池发起异步操作
using System; using System.Threading; namespace Asynchronous { class Program { static void Main(string[] args) { Console.WriteLine("主线程:准备发起一系列异步操作..."); ThreadPool.QueueUserWorkItem(ComputeBoundOp, 5); ThreadPool.QueueUserWorkItem(ComputeBoundOp, 7); Console.WriteLine("主线程:干其它事情..."); Thread.Sleep(1000); Console.WriteLine("按回车退出..."); Console.ReadLine(); } private static void ComputeBoundOp(object o) { Console.WriteLine("异步操作回调:state={0}", o); Thread.Sleep(1000); } } }
结果:
using System; using System.Threading; using System.Threading.Tasks; namespace Asynchronous { class Program { static void Main(string[] args) { Console.WriteLine("主线程:准备发起一系列异步操作..."); Task t = new Task(ComputeBoundOp,5); t.Start(); Console.WriteLine("主线程:干其它事情..."); Thread.Sleep(1000); Console.WriteLine("按回车退出..."); Console.ReadLine(); } private static void ComputeBoundOp(object o) { Console.WriteLine("异步操作回调:state={0}", o); Thread.Sleep(1000); } } }
3、利用System.Threading.Timer
using System; using System.Threading; namespace Asynchronous { class Program { static void Main(string[] args) { Console.WriteLine("主线程:准备发起一系列异步操作..."); Timer t = new Timer(ComputeBoundOp, 5, 50, 0); Console.WriteLine("主线程:干其它事情..."); Thread.Sleep(1000); Console.WriteLine("按回车退出..."); Console.ReadLine(); } private static void ComputeBoundOp(object o) { Console.WriteLine("异步操作回调:state={0}", o); Thread.Sleep(1000); } } }
4、利用APM(Asynchronous Programming Model)中的beginXXX方法
using System; using System.Threading; namespace Asynchronous { class Program { delegate void MyDelegate(object o); static void Main(string[] args) { Console.WriteLine("主线程:准备发起一系列异步操作..."); MyDelegate mydelegate = ComputeBoundOp; mydelegate.BeginInvoke(null,ComputeBoundOpCallBack,5); Console.WriteLine("主线程:干其它事情..."); Thread.Sleep(5000); Console.WriteLine("按回车退出..."); Console.ReadLine(); } private static void ComputeBoundOp(object o) { Thread.Sleep(1000);//模拟异步操作在做一些耗时的操作 } private static void ComputeBoundOpCallBack(IAsyncResult ar) { Console.WriteLine("异步操作的回调:{0}" , ar.AsyncState); } } }