using System; namespace ConsoleApplication1 { class Class1 { public delegate void AsyncEventHandler(); void Event1() { Console.WriteLine("Event1 Start"); System.Threading.Thread.Sleep(2000); Console.WriteLine("Event1 End"); } void Event2() { Console.WriteLine("Event2 Start"); int i=1; while(i<500) { i=i+1; // Console.WriteLine("Event2 "+i.ToString()); } Console.WriteLine("Event2 End"); } void CallbackMethod(IAsyncResult ar) { ((AsyncEventHandler) ar.AsyncState).EndInvoke(ar); } [STAThread] static void Main(string[] args) { long start=0; long end=0; Class1 c = new Class1(); Console.WriteLine("ready"); start=DateTime.Now.Ticks; /*** 同步 ****/ c.Event1(); c.Event2(); end = DateTime.Now.Ticks; Console.WriteLine(" 同步 时间刻度差=" + Convert.ToString(end - start)); /*** 异步1 ****/ start = DateTime.Now.Ticks; AsyncEventHandler asy = new AsyncEventHandler(c.Event1); IAsyncResult ia = asy.BeginInvoke(null, null); c.Event2(); asy.EndInvoke(ia); end = DateTime.Now.Ticks; Console.WriteLine(" 异步1 时间刻度差=" + Convert.ToString(end - start)); /*** 异步2 ****/ start = DateTime.Now.Ticks; AsyncEventHandler asy2 = new AsyncEventHandler(c.Event1); IAsyncResult ia2 = asy2.BeginInvoke(null, null); c.Event2(); while (!ia2.IsCompleted) //IAsyncResult.IsCompleted属性获取异步操作是否已完成的指示,发现异步调用何时完成. { } asy2.EndInvoke(ia2); end = DateTime.Now.Ticks; Console.WriteLine(" 异步2 时间刻度差=" + Convert.ToString(end - start)); /*** 异步3 ****/ /*** * IAsyncResult.AsyncWaitHandle属性获取用于等待异步操作完成的WaitHandle * WaitHandle.WaitOne方法阻塞当前线程,直到当前的WaitHandle收到信号 * 使用WaitHandle,则在异步调用完成之后,但在通过调用EndInvoke结果之前,可以执行其他处理 ***/ start = DateTime.Now.Ticks; AsyncEventHandler asy3 = new AsyncEventHandler(c.Event1); IAsyncResult ia3 = asy3.BeginInvoke(null, null); c.Event2(); ia3.AsyncWaitHandle.WaitOne(); end = DateTime.Now.Ticks; Console.WriteLine(" 异步3 时间刻度差=" + Convert.ToString(end - start)); /*** 异步4 ****/ /*** * 如果启动异步调用的线程不需要处理调用结果,则可以在调用完成时执行回调方法 * 要使用回调方法,必须将代表该方法的AsyncCallback委托传递给BeginInvoke ***/ start = DateTime.Now.Ticks; AsyncEventHandler asy4 = new AsyncEventHandler(c.Event1); asy4.BeginInvoke(new AsyncCallback(c.CallbackMethod), asy4); c.Event2(); end =DateTime.Now.Ticks; Console.WriteLine(" 异步4 时间刻度差=" + Convert.ToString(end - start)); Console.ReadLine(); } } }
相关推荐
总结来说,C#的同步和异步操作在处理耗时任务时扮演着不同的角色。同步操作简单但可能导致阻塞,而异步操作则提高了程序的并发性和响应性,但需要更复杂的编程模式和管理。理解并熟练运用这两种方法对于编写高性能的...
在C#中,委托是一种类型安全的事件处理机制,它可以被看作是指向方法的指针。在异步编程中,委托允许我们使用BeginInvoke和EndInvoke方法启动异步调用。下面我们将深入探讨这两个方法以及如何使用委托实现异步操作。...
C#异步编程是.NET Framework提供的一种机制,允许开发者在应用程序中实现非阻塞操作,提高程序的响应性和效率。本文将深入探讨异步编程的核心概念、方法以及使用技巧。 同步方法和异步方法的区别在于执行流程。同步...
### C#反射学习文档:深入理解同步与异步方法调用 #### 概述 本文档旨在介绍C#中同步与异步方法调用的基本概念及其应用方式,这对于理解和掌握.NET框架下的多线程编程非常关键。同步和异步方法的选择直接影响到...
总结,委托异步调用是C#中实现非阻塞操作的重要手段,它将函数指针的概念与异步编程相结合,提供了灵活、高效的方法来处理复杂的并发问题。理解并熟练掌握这一技术对于开发高性能的.NET应用程序至关重要。
// 异步处理任务,例如使用Redis操作 Task.Run(() => ProcessTask(message)); }; channel.BasicConsume(queue: "task_queue", autoAck: true, consumer: consumer); ``` 通过以上内容,我们可以看到如何在...