其实这也是面试中被问倒的问题:(贴在这里纪念一下,注:只是简单的罗列,详细原理及分析,请参阅《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); } } }
结果:
或2、利用Threading.Tasks中的Task
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); } } }
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦