All articles| All Pictures| All Softwares| All Video| Go home page| Write articles| Upload pictures

Reading number is top 10 articles
Redhat,Linux,AS4下的LAMP与Discuz安装_php资料_编程技术
delphi获取可用驱动器信息
轻松掌握Ajax.net系列教程十二:使用TabContainer&TabPanel_[Asp.Net教程]
WML学习(四):锚和任务_[XML教程]
PHP实例:精确到每一秒钟的在线人数显示代码_[PHP教程]
一次编辑,GridView,的所有行_[Asp.Net教程]
Transact,SQL,常用语句以及函数_[SQL,Server教程]
PHP实现文本文件直接调用实例_[PHP教程]
c#中连接SqL2005数据库错误解决及转义字符_.net资料_编程技术
PHP利用cookie做的投票程序_[PHP教程]
Reading number is top 10 pictures
乳娘帕梅拉安德森3
The little girl with long hair3
In the world the most mysterious 21 place landscape1
Household design of gorgeous series
The little girl with long hair2
两张抽象画
NeedWallpaper7
Absolutely shocked. National geographic 50 animal photographys6
So beauty, will let you spray blood6
XuYing poker perspective garment debut
Download software ranking
功夫熊猫2(上集)
艳兽都市
Boxer Classic video1
Tram sex maniac 2 (H) rar bag16
Tram sex maniac 2 (H) rar bag1
Boxer vs Yellow4
Rio big adventure
Sora aoi's film--cangkong_Blue.Sky
Tram sex maniac 2 (H) rar bag13
Tram sex maniac 2 (H) rar bag9
delv published in(发表于) 2014/1/10 6:23:25 Edit(编辑)
.NET关于同步、异步及Socket_[Asp.Net教程]

.NET关于同步、异步及Socket_[Asp.Net教程]

.NET关于同步、异步及Socket_[Asp.Net教程]

以SOCKET通信中的异步方法为例:


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);


    Client.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)的完成,须得同步一下。


来源:网络







添加到del.icio.us 添加到新浪ViVi 添加到百度搜藏 添加到POCO网摘 添加到天天网摘365Key 添加到和讯网摘 添加到天极网摘 添加到黑米书签 添加到QQ书签 添加到雅虎收藏 添加到奇客发现 diigo it 添加到饭否 添加到飞豆订阅 添加到抓虾收藏 添加到鲜果订阅 digg it 貼到funP 添加到有道阅读 Live Favorites 添加到Newsvine 打印本页 用Email发送本页 在Facebook上分享


Disclaimer Privacy Policy About us Site Map

If you have any requirements, please contact webmaster。(如果有什么要求,请联系站长)
Copyright ©2011-
uuhomepage.com, Inc. All rights reserved.