이 SOCKET 통신 방식은
public static ManualResetEvent ConnectDone = new ManualResetEvent(false);
공개 정적 무효 ConnectCallback(IAsyncResult ar)
{
소켓 sClient = (소켓)ar.AsyncState;
sClient.EndConnect(ar);
Console.WriteLine("{0}에 연결된 소켓", sClient.RemoteEndPoint.ToString());
ConnectDone.Set();
}
공개 정적 void Main(string[] arg)
{
try
{
IPHostEntry ipHost = Dns.Resolve("127.0.0.1");
IPAddress ipAddr = ipHost.AddressList[0];
IPEndPoint endPoint = new IPEndPoint(ipAddr, 11000);
소켓 sClient = 새 소켓(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp);
sClient.BeginConnect(endPoint, new AsyncCallback(ConnectCallback),
sClient);
for (int i = 0; i <5; i++)
Console.WriteLine("다른 작업을 수행하십시오.");
byte[] byteData = Encoding.ASCII.GetBytes("일부 데이터.");
ConnectDone.WaitOne();
sClient.BeginSend(byteData, 0, byteData.Length, 0,
new AsyncCallback(SendCallback), sClient);
………
}
(注:ManualResetEvent는 允许线程통过发信号互상信。통상적으로, 此信涉及一个线程에서 其他线程进行을 통해 전송됩니다.
信号灯,可以利用它的信号来通知其它线程。它有几个要적합한 방법: Reset(),Set(),WaitOne().持来的状态不变直到它Reset() 또는 Set()방법법에 따라 Set()방법을 사용하여 Reset()방법을 사용합니다.直到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.");
等待同步방식의 返回,但是在异步的情况下,将可能回5行“다른 작업을 수행하십시오.” 특정 종류의
至于에서 sClient.BeginSend(…)방법을 사용하기 전에 ConnectDone.WaitOne(), 则是由于前者依赖于连接操작성(即ConnectCallback)을 사용하여 须得同步一下
。