ASP.NETの知られざること(四)
2945 ワード
開発ではマルチスレッドに触れることはめったにありませんが、彼から離れられないことを認めなければなりません.
上记のブログ(ASP.NETのような知られていないこと(三))に続き、基本的にはMini版のサーバーが実现できますが、不足もあります.
クライアントがすばやく接続されると、サービス側はすぐに潰されます.
幸いなことに、Socketクラスは実現しました.NETフレームワークの非同期呼び出しモードは,このモードを用いてスレッドプールを利用することで,サーバが到来したリクエストにより良いサービスを提供できる.
これにより、私たちのサーバはより効率的になり、スレッドプールからデータを送り返します.
ここでの非同期呼び出し(new AsyncCallback(Program.CloseConnection))は、サーバをより効率的にするために、現在のスレッドが詰まっているため、リスニングスレッドをEndSendで待機させることは意味がないため、接続を閉じるコールバック方法を使用していることに注意してください.
サーバーの段階は終わって、あなたも彼に対して一定の理解があることを信じて、次にASPについて話します.NETではマルチスレッドをどのように実現しているのか.
上记のブログ(ASP.NETのような知られていないこと(三))に続き、基本的にはMini版のサーバーが実现できますが、不足もあります.
クライアントがすばやく接続されると、サービス側はすぐに潰されます.
幸いなことに、Socketクラスは実現しました.NETフレームワークの非同期呼び出しモードは,このモードを用いてスレッドプールを利用することで,サーバが到来したリクエストにより良いサービスを提供できる.
リビルドされたバージョン:
class Program
{
private const int ConnectionQueueLength = 4;
private const int ListenPort = 1234;
private const int MaxConnectionHandlers = 4;
static void HandleConnection(IAsyncResult ar)
{
//AsyncResult asyncResult = (AsyncResult) ar;
Socket listener=(Socket)ar.AsyncState;
Socket newConnectin = listener.EndAccept(ar);
byte[] msg = Encoding.UTF8.GetBytes("Hello World");
newConnectin.BeginSend(msg, 0, msg.Length, SocketFlags.None, new AsyncCallback(Program.CloseConnection),
newConnectin);
}
static void CloseConnection(IAsyncResult ar)
{
Socket socket = ar.AsyncState as Socket;
if (socket!=null)
{
socket.Close();
}
}
static void Main(string[] args)
{
Socket listenSocket=new Socket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp);
listenSocket.Bind(new IPEndPoint(IPAddress.Any,ListenPort));
listenSocket.Listen(ConnectionQueueLength);
for (int i = 0; i < MaxConnectionHandlers; i++)
{
listenSocket.BeginAccept(new AsyncCallback(Program.HandleConnection), listenSocket);
}
Console.ReadKey();
}
}
これにより、私たちのサーバはより効率的になり、スレッドプールからデータを送り返します.
ここでの非同期呼び出し(new AsyncCallback(Program.CloseConnection))は、サーバをより効率的にするために、現在のスレッドが詰まっているため、リスニングスレッドをEndSendで待機させることは意味がないため、接続を閉じるコールバック方法を使用していることに注意してください.
まとめ
サーバーの段階は終わって、あなたも彼に対して一定の理解があることを信じて、次にASPについて話します.NETではマルチスレッドをどのように実現しているのか.