欢迎光临
我们一直在努力

.NET关于同步、异步及Socket-.NET教程,.NET Framework

建站超值云服务器,限时71元/月

 

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

           

            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.knowsky.com
赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » .NET关于同步、异步及Socket-.NET教程,.NET Framework
分享到: 更多 (0)