อ้างอิง SOCKET:
Public static ManualResetEvent ConnectDone = new ManualResetEvent(false);
โมฆะสาธารณะคง ConnectCallback (IAsyncResult ar)
{
Socket sClient = (Socket) ar.AsyncState;
sClient.EndConnect(ar);
Console.WriteLine("ซ็อกเก็ตเชื่อมต่อกับ {0}", sClient.RemoteEndPoint.ToString());
ConnectDone.Set();
-
โมฆะคงที่สาธารณะ Main (สตริง [] arg)
{
ลอง
{
IPHostEntry ipHost = Dns.Resolve ("127.0.0.1");
IPAddress ipAddr = ipHost.AddressList[0];
จุดสิ้นสุด IPEndPoint = IPEndPoint ใหม่ (ipAddr, 11000);
Socket sClient = ซ็อกเก็ตใหม่ (AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp);
sClient.BeginConnect (จุดสิ้นสุด, AsyncCallback ใหม่ (ConnectCallback),
sClient);
สำหรับ (int i = 0; i <5; i++)
Console.WriteLine ("ทำงานอื่นบ้าง");
ไบต์ [] byteData = Encoding.ASCII.GetBytes ("ข้อมูลบางส่วน");
ConnectDone.WaitOne();
sClient.BeginSend (byteData, 0, byteData.Length, 0,
AsyncCallback ใหม่ (SendCallback), sClient);
……
}
(注:ManualResetEvent 允许线程通过发信号互相通信。通常,此通信涉及一个线程在其他线程进行之前必须完成任务。
ManualResetEvent就个信号灯,可以利用它的信号来通知其它线程。它有几个重要คำสั่ง:Reset(),Set(),WaitOne()。初始化该对象时,用户可以指定其默认的状态(有信号/无信号),在初始化以后,该对象将保持原来的状态不变直到它รีเซ็ต()或者Set()รีเซ็ต()รีเซ็ต()方法将其设置为无信号状态,Set()方法将其设置为有信号状态。WaitOne()方法使当前线程挂起直到ManualResetEvent对象处于有信号状态,此时该线程将被激活。)
本例中,主线程调用ConnectDone.WaitOne();后,主线程阻塞,直到连接操作(即ConnectCallback)完成,因为连接操作完成之后,执行了ConnectDone.Set()将信号灯设置为有信号,由于调用了ManualResetEvent.WaitOne()方法而处在等待状态的主线程将接收到这个信号,于是它接着往下执行,完成后边的工作.
同步与异步:
简单地说,同步即程序执行一个方法,等该方法返回之后,继续往下走,
异步:即程序调用一个方法后立即返回,“宏观”而言,主线程与方法线程并行执行
ซ็อกเก็ตของ BeginConnect 被调用后,接着执行主线程中该语句之后的代码,即:
for (int
i = 0; i <5; i++)
Console.WriteLine("Do Some Other งาน.");
byte[] byteData = Encoding.ASCII.GetBytes("Some Data.");
如果调用的是同步方法,那么,输出 “Socket เชื่อมต่อไปยัง…” หนึ่งเดียวในที่นี้ “Do Some Other Work” อีกสองสามนาที等待同步方法的返回,但是在异步的情况下,将可能在5行“Do Some Other Work”之间的某个时刻出现“Socket เชื่อมต่อไปยัง…”还依赖于操作系统的线程调度)。
至于在sClient.BeginSend(…)方法之前调用ConnectDone.WaitOne(),则是由于前者依赖于连接操作(即ConnectCallback)ของ步หนึ่ง下.