以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 conectado a {0}", sClient.RemoteEndPoint.ToString());
ConnectDone.Set();
}
public static void Main(string[] arg)
{
intentar
{
IPHostEntry ipHost = Dns.Resolve("127.0.0.1");
Dirección IP ipAddr = ipHost.AddressList[0];
IPEndPoint endPoint = nuevo IPEndPoint(ipAddr, 11000);
Socket sClient = nuevo Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp);
sClient.BeginConnect(endPoint, nuevo AsyncCallback(ConnectCallback),
sClient);
for (int i = 0; i <5; i++)
Console.WriteLine("Hacer algún otro trabajo.");
byte[] byteData = Codificación.ASCII.GetBytes("Algunos datos.");
ConnectDone.WaitOne();
sClient.BeginSend(byteData, 0, byteData.Length, 0,
nuevo AsyncCallback(SendCallback), sClient);
………
}
(注:ManualResetEvent
ManualResetEvent的方法:Reset(),Set(),WaitOne().以后,该对象将保持原来的状态不变直到它的Reset()或者Set()方法被调用,Reset()方法将其设置为无信号状态,Set()方法将其设置为有信号状态。WaitOne()方法使当前线程挂起直到ManualResetEvent对象处于有信号状态,此时该线程将被激活。)
Utilice ConnectDone.WaitOne();后,执行了ConnectDone.Set()将信号灯设置为有信号,由于调用了ManualResetEvent.WaitOne()方法而处在等待状态的主线程将接收到这个信号,于是它接着往下执行,完成后边的工作。
同步与异步:
简单地说,同步即程序执行一个方法,等该方法返回之后,继续往下走,
异步:即程序调用一个方法后立即返回,“宏观”而言,主线程与方法线程并行执行。
Para (int i = 0; i <5; i++)
(
"Haz algo más Trabajar.");
byte[] byteData = Encoding.ASCII.GetBytes("Algunos datos.");
如果调用的是同步方法,那么,输出“Socket conectado a…”一定会在“Hacer algún otro trabajo”.之前,因为主线程必须等待同步方法的返回,但是在异步的情况下,将可能在5行“Hacer algún otro trabajo.”之间的某个时刻出现“Enchufe conectado a…”的输出(实际情况还依赖于操作系统的线程调度)。
至于在sClient.BeginSend(…)方法之前调用ConnectDone.WaitOne(),则是由于前者依赖于连接操作(即ConnectCallback)的完成,须得同步一下。