.NET关于同步、异步及Socket
点击次数:23 次 发布日期:2008-11-26 12:21:24 作者:源代码网
|
源代码网推荐 源代码网推荐 public static ManualResetEvent ConnectDone = new ManualResetEvent(false); 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 public static void ConnectCallback(IAsyncResult ar) 源代码网推荐 源代码网推荐 { 源代码网推荐 源代码网推荐 Socket sClient = (Socket)ar.AsyncState; 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 sClient.EndConnect(ar); 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 Console.WriteLine("Socket connected to {0}", sClient.RemoteEndPoint.ToString()); 源代码网推荐 源代码网推荐 ConnectDone.Set(); 源代码网推荐 源代码网推荐 } 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 public static void Main(string[] arg) 源代码网推荐 源代码网推荐 { 源代码网推荐 源代码网推荐 try 源代码网推荐 源代码网推荐 { 源代码网推荐 源代码网推荐 IPHostEntry ipHost = Dns.Resolve("127.0.0.1"); 源代码网推荐 源代码网推荐 IPAddress ipAddr = ipHost.AddressList[0]; 源代码网推荐 源代码网推荐 IPEndPoint endPoint = new IPEndPoint(ipAddr, 11000); 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 Socket sClient = new Socket(AddressFamily.InterNetwork, 源代码网推荐 源代码网推荐 SocketType.Stream, ProtocolType.Tcp); 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 sClient.BeginConnect(endPoint, new AsyncCallback(ConnectCallback), 源代码网推荐 源代码网推荐 sClient); 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 for (int i = 0; i <5; i++) 源代码网推荐 源代码网推荐 Console.WriteLine("Do Some Other Work."); 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 byte[] byteData = Encoding.ASCII.GetBytes("Some Data."); 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 ConnectDone.WaitOne(); 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 sClient.BeginSend(byteData, 0, byteData.Length, 0, 源代码网推荐 源代码网推荐 new AsyncCallback(SendCallback), sClient); 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 ……… 源代码网推荐 源代码网推荐 } 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 (注:ManualResetEvent 允许线程通过发信号互相通信。通常,此通信涉及一个线程在其他线程进行之前必须完成的任务。 源代码网推荐 源代码网推荐 ManualResetEvent就像一个信号灯,可以利用它的信号来通知其它线程。它有几个重要的方法:Reset(),Set(),WaitOne()。初始化该对象时,用户可以指定其默认的状态(有信号/无信号),在初始化以后,该对象将保持原来的状态不变直到它的Reset()或者Set()方法被调用,Reset()方法将其设置为无信号状态,Set()方法将其设置为有信号状态。WaitOne()方法使当前线程挂起直到ManualResetEvent对象处于有信号状态,此时该线程将被激活。) 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 本例中,主线程调用ConnectDone.WaitOne();后,主线程阻塞,直到连接操作(即ConnectCallback)完成,因为连接操作完成之后,执行了ConnectDone.Set()将信号灯设置为有信号,由于调用了ManualResetEvent.WaitOne()方法而处在等待状态的主线程将接收到这个信号,于是它接着往下执行,完成后边的工作。 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 同步与异步: 源代码网推荐 源代码网推荐 简单地说,同步即程序执行一个方法,等该方法返回之后,继续往下走, 源代码网推荐 源代码网推荐 异步:即程序调用一个方法后立即返回,“宏观”而言,主线程与方法线程并行执行。 源代码网推荐 源代码网推荐 就本例而言,socket的异步方法BeginConnect被调用后,接着执行主线程中该语句之后的代码,即: 源代码网推荐 源代码网推荐 for (int i = 0; i <5; i++) 源代码网推荐 源代码网推荐 Console.WriteLine("Do Some Other Work."); 源代码网推荐 源代码网推荐 byte[] byteData = Encoding.ASCII.GetBytes("Some Data."); 源代码网推荐 源代码网推荐 如果调用的是同步方法,那么,输出“Socket connected to…”一定会在“Do Some Other Work.”之前,因为主线程必须等待同步方法的返回,但是在异步的情况下,将可能在5行“Do Some Other Work.”之间的某个时刻出现“Socket connected to…”的输出(实际情况还依赖于操作系统的线程调度)。 源代码网推荐 源代码网推荐 至于在sClient.BeginSend(…)方法之前调用ConnectDone.WaitOne(),则是由于前者依赖于连接操作(即ConnectCallback)的完成,须得同步一下。 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 做人要厚道,请注明转自酷网动力(www.ASPCOOL.COM)。 源代码网推荐 源代码网供稿. |
