4

Accept同期とは異なり、BeginAccept新しく作成された接続用のソケットを提供しません。EndAcceptただし、そうですが、将来の接続が受け入れられなくなることもあります。そこで、次のコードを作成して、複数の「クライアント」がサーバーに接続できるようにしました。

serverSocket.BeginAccept(AcceptCallback, serverSocket);

AcceptCallbackコード:

void AcceptCallback(IAsyncResult result)
{
    Socket server = (Socket)result.AsyncState;
    Socket client = server.EndAccept(result);

    // client socket logic...

    server.BeginAccept(AcceptCallback, server); // <- continue accepting connections
}

これを行うためのより良い方法はありますか?それは本質的に非同期呼び出しを再帰的にループするので、それは少し「ハッキー」のようです。
おそらく、複数のスレッドが作成されるなど、非同期メソッドを複数回呼び出すことにはオーバーヘッドがありますか?

4

2 に答える 2

4

これを行う方法は、非同期ソケットを使用する場合に適しています。個人的には、AsyncState からソケットを取得した直後に BeginAccept を移動します。これにより、追加の接続をすぐに受け入れることができます。現時点では、別の接続を受け入れる準備が整う前に処理コードが実行されます。

Usr が述べたように、タスクで await を使用するようにコードを書き直すことができると思います。

于 2013-01-09T20:01:59.557 に答える
1

コールバックベースの非同期 IO を扱う場合、これは正常です。そして、それが使用するのがとてもひどいものです!

C# await を使用できますか? これは単純なwhile (true) { await accept(); }ループに単純化されます。

于 2012-12-16T21:22:22.133 に答える