socket同步异步:.NET有关同步、异步及Socket来源: 发布时间:星期六, 2009年9月12日 浏览:42次 评论:0
以SOCKET通信中异步思路方法为例:
public ManualReEvent ConnectDone = ManualReEvent(false); public void ConnectCallback(IAsyncResult ar) { Socket sClient = (Socket)ar.AsyncState; sClient.EndConnect(ar); Console.WriteLine("Socket connected to {0}", sClient.RemoteEndPo.); ConnectDone.Set; } public void Main( arg) { try { IPHostEntry ipHost = Dns.Resolve("127.0.0.1"); IPAddress ipAddr = ipHost.AddressList[0]; IPEndPo endPo = IPEndPo(ipAddr, 11000); Socket sClient = Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); sClient.BeginConnect(endPo, AsyncCallback(ConnectCallback), sClient); for ( i = 0; i <5; i) Console.WriteLine("Do Some Other Work."); Data = Encoding.ASCII.GetBytes("Some Data."); ConnectDone.WaitOne; sClient.BeginSend(Data, 0, Data.Length, 0, AsyncCallback(SendCallback), sClient); ……… } (注:ManualReEvent 允许线程通过发信号互相通信通常此通信涉及个线程在其他线程进行的前必须完成任务 ManualReEvent就像个信号灯可以利用它信号来通知其它线程它有几个重要思路方法:ReSetWaitOne化该对象时用户可以指定其默认状态(有信号/无信号)在化以后该对象将保持原来状态不变直到它Re或者Set思路方法被Re思路方法将其设置为无信号状态Set思路方法将其设置为有信号状态WaitOne思路方法使当前线程挂起直到ManualReEvent对象处于有信号状态此时该线程将被激活) 本例中主线程ConnectDone.WaitOne;后主线程阻塞直到连接操作(即ConnectCallback)完成连接操作完成的后执行了ConnectDone.Set将信号灯设置为有信号由于了ManualReEvent.WaitOne思路方法而处在等待状态主线程将接收到这个信号于是它接着往下执行完成后边工作 同步和异步: 简单地说同步即执行个思路方法等该思路方法返回的后继续往下走 异步:即个思路方法后立即返回“宏观”而言主线程和思路方法线程并行执行 就本例而言异步思路方法BeginConnect被后接着执行主线程中该语句的后代码即: for ( i = 0; i <5; i) Console.WriteLine("Do Some Other Work."); Data = 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)完成须得同步下 0
相关文章读者评论发表评论 |