SOCKET 通信中のメソッドの例:
public static ManualResetEvent ConnectDone = new ManualResetEvent(false);
public static void ConnectCallback(IAsyncResult ar)
{
ソケット sClient = (ソケット)ar.AsyncState;
sClient.EndConnect(ar);
Console.WriteLine("ソケットが {0} に接続されました", sClient.RemoteEndPoint.ToString());
ConnectDone.Set();
}
public static void Main(string[] arg)
{
try
{
IPHostEntry ipHost = Dns.Resolve("127.0.0.1");
IPアドレスipAddr = ipHost.AddressList[0];
IPEndPoint エンドポイント = 新しい IPEndPoint(ipAddr, 11000);
ソケット 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("他の作業を行います。");
byte[] byteData = Encoding.ASCII.GetBytes("何らかのデータ");
ConnectDone.WaitOne();
sClient.BeginSend(byteData, 0, byteData.Length, 0,
新しい AsyncCallback(SendCallback), sClient);
………
}
(注:ManualResetEvent は、送信信号によるライン プロセスの相互通信を許可します。通常、この通信は、他のライン プロセスを実行する前に完了する必要があるタスクに関係します。ManualResetEvent は、その信号を
使用して他のライン プロセスを通知できます。メソッド: Reset()、Set()、WaitOne()。 このオブジェクトを初期化するとき、ユーザーはその状態 (信号あり/信号なし) を指定できます。初期化後、そのオブジェクトは、次の操作が行われるまで、元の状態を維持します。 WaitOne() メソッドまたは Set() メソッドが使用され、Reset() メソッドは信号なし状態に設定され、Set() メソッドは信号あり状態に設定されます。信号状態、この時点でこの回線プロセスが起動されます。)
この例では、主回線プログラムが 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.");
結果调用的是同步方法,那么,出“ソケットが…に接続されています” 固定会在“他の作業を行います。”の前に,主回線のため必ず必要です等同期メソッドの戻りを待っていますが、状況によっては、「他の作業を行います。」を実行している間の特定の瞬間に「ソケットが…に接続されています」という出力が表示される可能性があります (この場合、オペレーティング システムのオンライン手順にも依存します)。
sClient.BeginSend(…) メソッドの前に ConnectDone.WaitOne() を使用します。これは、前者が接続操作 (つまり ConnectCallback) に依存しているため、次に進みます
。