27042


要求を受け入れて、TCPのリードをして処理をしたいだけです。  
ですが、非同期で実行してすぐに次のAccept()を受け入れて待ち状態にしたいです。

async / awaitをあまり理解できていないので躓いています。

次のように書いてみたのですが、これだど要求を待ってから同期的に処理を書いているので意味がありません。

[code]

    var listener = new TcpListener(IPAddress.Any, Port);
    listener.Start();
    while (true)
    {
        Task<TcpClient> client = listener.AcceptTcpClientAsync();
        client.Wait();
        var stream = client.Result.GetStream();
        // streamで色々読み取る。
    }
    
[/code]

私のやりたいことに対して、正しい書き方をご教授いただけると助かります。

ちなみに以下のように書いてみるとすぐに反応が返ってくるのですが、まだ要求は来ていませんのでclientは使えません。

[code]

    TcpClient client = await listener.AcceptTcpClientAsync();
    
[/code]


CC BY-SA 3.0
2016-06-24T09:59:49.860
27027
2016-06-24T15:07:57.307
14288
question
c# .net
.NETのTcpListenerクラスの使い方を教えてください


質問文のコードは`AcceptTcpClientAsync()`が完了したあとに`TcpClient`を使用し、また`AcceptTcpClientAsync()`を実行するというフローになっているため同時に一件しか要求を処理することができません。  
`TcpClient`を得たらスレッドを分割して直ちに次の`TcpClient`を待機するような実装にする必要があります。

[code]

    void BeginAccept()
    {
        listener.AcceptTcpClientAsync()
            .ContinueWith(t => 
            {
                BeginAccept(); // Streamに対する処理の前にAcceptTcpClientAsync()を再度呼び出す
                var stream = t.Result;
                // Streamに対する操作
            });
    }
    
[/code]


CC BY-SA 3.0
2016-06-24T15:07:57.307
27042
2016-06-24T15:07:57.307
5750
27027
answer