gpt4 book ai didi

c# - 如何以比这更好的方式创建异步 TCP 服务器?

转载 作者:行者123 更新时间:2023-12-05 09:05:30 26 4
gpt4 key购买 nike

我有一个服务器应用程序可以接受来自一组大约 10000 个客户端(实际上是具有 GPRS 接口(interface)的现场设备)的 TCP 连接。

接受连接的部分是这样的:

public async System.Threading.Tasks.Task AcceptConnections()
{
_listenerProxy.StartListen();
var taskList = new List<System.Threading.Tasks.Task>();
var application = _configManager.Configuration.GetSection("application");
var maxTasks = int.Parse(application["MaxTasksPerListener"]);
while (true)
{
if (taskList.Count > maxTasks)
{
_logger.Info($"Waiting for handling task to be completed {_listenerProxy.Port}.");
await System.Threading.Tasks.Task.WhenAny(taskList.ToArray()).ConfigureAwait(false);
taskList.RemoveAll(t => t.IsCompleted); // at least one task affected, but maybe more
}
_logger.Info($"Waiting for client to be accepted on port {_listenerProxy.Port}.");
(var readStream, var writeStream, var sourceIP, var sourcePort) = await _listenerProxy.AcceptClient().ConfigureAwait(false);
_logger.Info($"Client accepted on port {_listenerProxy.Port}: IP:{sourceIP}, Port:{sourcePort}");

var clientContext = new ClientContext<TSendMessage, TReceiveMessage>
{
SourceAddress = sourceIP,
SourcePort = sourcePort,
DataAdapter = DataAdapterFactory<TSendMessage, TReceiveMessage>.Create(readStream, writeStream)
};
taskList.Add(HandleClient(clientContext));
}
}

HandleClient 方法定义为:

public async System.Threading.Tasks.Task HandleClient(ClientContext<TSendMessage, TReceiveMessage> clientContext);

我希望能够并行处理预定义数量的请求(处理函数是 HandleClient)。客户端将连接,发送一些少量数据,然后关闭连接。由于整个项目是异步的,因此我很想对该部分也尝试异步方法。

我很确定不推荐此解决方案,但我不知道如何以更好的方式完成它。我在这里找到了一个非常相关的主题:How to run a Task on a new thread and immediately return to the caller?

Stephen Cleary 在那里发表了评论:

Well, the very first thing I'd recommend is to try a simpler exercise.Seriously, an asynchronous TCP server is one of the most complexapplications you can choose.

那么,在这种情况下,“正确”的方法是什么?我知道,我的方法“有效”,但我有一种不好的感觉,尤其是 HandleClient 或多或少是“即发即忘”。我对结果任务感兴趣的唯一原因是“限制”吞吐量(最初它是异步无效的)。事实上,我有与链接中的 TO 完全相同的问题。但是,我仍然不知道这种方法中最大的问题是什么。

我会很感激建设性的提示...谢谢。

最佳答案

一句话:红隼。将所有这些问题转移给 同时获得许多其他好处,例如高级缓冲区生命周期管理和面向异步的设计。这里的关键 API 是 UseConnectionHandler<T> ,例如:

public static IWebHostBuilder CreateHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args).UseKestrel(options =>
{ // listen on port 1000, using YourHandlerHere for the handler
options.ListenLocalhost(1000, o => o.UseConnectionHandler<YourHandlerHere>());
}).UseStartup<Startup>();

您可以看到一个简单但可运行的示例 here (嘿,如果你把一个大部分功能类似 redis 的服务器称为“微不足道的”),或者我在私有(private) github 存储库中有其他示例,我可能会发送给你,包括一个你需要做的就是实现帧解析器的示例(库代码处理其他一切,并且适用于 TCP 和 UDP)。

至于“throttle”——这听起来像是一个异步信号量; SemaphoreSlimWaitAsync .

关于c# - 如何以比这更好的方式创建异步 TCP 服务器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67195308/

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