0

例として.netソケットを使用するだけで、次を使用します。

TcpListener listener = new TcpListener(ip, port);
while(true)
{
    TcpClient client = socket.AcceptTcpClient();
    DoSomethingWithClient(client);
}

しかし、他の方法は次のようです( http://msdn.microsoft.com/en-us/library/system.net.sockets.tcplistener.beginaccepttcpclient.aspxに基づく):

public static ManualResetEvent tcpClientConnected = new ManualResetEvent(false);

public static void DoBeginAcceptTcpClient(TcpListener listener)
{
    tcpClientConnected.Reset();
    listener.BeginAcceptTcpClient(new AsyncCallback(DoAcceptTcpClientCallback), listener);
    tcpClientConnected.WaitOne();
}

public static void DoAcceptTcpClientCallback(IAsyncResult ar) 
{
    TcpListener listener = (TcpListener) ar.AsyncState;
    TcpClient client = listener.EndAcceptTcpClient(ar);
    DoSomethingWithClient(client);
    tcpClientConnected.Set();
}

IMHO async スタイルには 3 倍のコードが必要であり、goto スパゲッティのように見えます。読みにくく、関連するコードを分離する必要があります。では、なぜ非同期の方法を使用するのでしょうか? おそらく、それはいくつかの利点があるに違いありませんか?

4

3 に答える 3

5

これには、呼び出し元のスレッドをブロックしないという利点があります。これは、作業中も応答性を維持する必要がある対話型アプリケーションを作成する場合に特に重要です。

C# 5 以降、この種のコードの記述と読み取りをより簡単にするasync/があります。await

于 2013-07-01T14:22:43.727 に答える
0

多数の同時クライアントの場合、非同期メソッドと同期メソッドを使用すると、アプリは同じジョブを実行しながら使用するスレッドを減らすことができます。

たとえば、最初は約 30 のスレッドを使用して 2000 の発信接続を作成/管理するアプリを実行しました (スレッドがスレッド プールに返されるにつれて少なくなります)。

ただし、通常、この方法でプログラムするのは少しトリッキーであり、ブロックされたスレッドのすべてのソースを減らして利点を最大化する必要があるため、少し滑りやすい坂道になる可能性があります。

新しいasync/await構文により、コード スパゲッティの問題が軽減され、非同期呼び出しを組み込んだ通常の「壊れていない」メソッドを記述できるようになります。

asyncC# 5 と/構文を使用できない場合は、awaitJ. Richter の AsyncEnumerator のような他の方法があります。

于 2013-07-01T14:44:44.453 に答える