gpt4 book ai didi

c# - 使用 SocketAsyncEventArgs 编写可扩展的套接字服务器

转载 作者:太空宇宙 更新时间:2023-11-03 13:27:44 25 4
gpt4 key购买 nike

好吧,我读了很多关于编写高可扩展服务器的问题,但我从来没有真正找到一个好的答案。无论如何,我想创建一个可扩展的客户端,它可以处理大量数据和连接。我创建的是一个使用 SocketAsyncEventArgs 和 C#5 async/await 的简单客户端,如下所示:

public async Task<int> SendAsync(byte[] buffer, int offset, int size)
{
var socketArgs = new SocketAsyncEventArgs();
var tcs = new TaskCompletionSource<int>();

socketArgs.SetBuffer(buffer, offset, size);
socketArgs.Completed += (sender, args) =>
{
tcs.SetResult(socketArgs.BytesTransferred);
LastSocketError = socketArgs.SocketError;
};

if (_clientSocket.SendAsync(socketArgs))
return await tcs.Task;

LastSocketError = socketArgs.SocketError;
return socketArgs.BytesTransferred;
}

还有 ConnectAsync、ReceiveAsync 和 AcceptAcync。这对客户端非常有用,但在我的服务器上我不知道如何正确处理它。(我最终会为每个客户端创建一个线程来接收。) 我可以使用 APM(开始/结束)或使用 EventHandler,但这会破坏使用 async/await 的目的,最终在为每次调用创建新的 SocketAsyncEventArgs 时,内存效率不高。我尝试创建一个池(使用 ConcurrentBag),但我仍然不得不一遍又一遍地创建一个 TaskCompletionSource(因为你只能使用它一次。)

所以我认为创建它不是一个好主意,尽管我真的很喜欢它。创建一个高可扩展性和高性能服务器的好的设计是什么?

最佳答案

当然,我们可以根据任务调整此类异步方法,但这在很大程度上会破坏这些方法的目的,类似于 APM 中 IAsyncResult 的分配。然而,即便如此,我们还是希望能够利用编译器对async/await的支持,方便使用sockets编写异步代码。我们想要我们的蛋糕,也吃它。当然,编译器承认期望的不仅仅是任务。所以,如果你有像这样的特殊场景,你可以利用基于编译器模式的支持来等待事情。更多信息: https://blogs.msdn.microsoft.com/pfxteam/2011/12/15/awaiting-socket-operations/

关于c# - 使用 SocketAsyncEventArgs 编写可扩展的套接字服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21812368/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com