C# 异步处理的服务器实现
以下是场景: 有客户端向服务器发送请求(这将是套接字或wcf服务器,这并不重要) 服务器将保持一个开放的双工通道,并使用它向客户端发送应答(序列化数据)。服务器将处理请求,并涉及查询生成(基于请求的参数)和针对各种类型的数据源(sql Server、文件系统、analysis services Server-OLAP、脱机多维数据集等)执行。如此繁重的IO任务——肯定经常是长时间运行的C# 异步处理的服务器实现,c#,.net,c#-4.0,asynchronous,task-parallel-library,C#,.net,C# 4.0,Asynchronous,Task Parallel Library,以下是场景: 有客户端向服务器发送请求(这将是套接字或wcf服务器,这并不重要) 服务器将保持一个开放的双工通道,并使用它向客户端发送应答(序列化数据)。服务器将处理请求,并涉及查询生成(基于请求的参数)和针对各种类型的数据源(sql Server、文件系统、analysis services Server-OLAP、脱机多维数据集等)执行。如此繁重的IO任务——肯定经常是长时间运行的 性能是重要的,同时考虑数百或数千个请求。它必须是可伸缩的 我从未使用过TPL,也没有编写过异步服务器。但这几天
性能是重要的,同时考虑数百或数千个请求。它必须是可伸缩的
我从未使用过TPL,也没有编写过异步服务器。但这几天我读了很多书。。。我还是无法控制自己关于这个话题有很多讨论。。。例如,见。这里提到了Chris Mullins的帖子,这些帖子已经丢失了。我有一个链接到一些网络档案,其中有一个帖子的缓存版本,我将寻找它 更新: 找到了Chris Mullins的帖子: 我们在一些实验室使用巨大的IA64进行了相当多的可伸缩性测试 服务器。结果,以及相当多的最好的 我们提出的实践详情如下: 请参见此处的存档副本: 我仍在为正在开发的类似应用程序绞尽脑汁。到目前为止我所学到的几点:
异步操作(开始*、结束*、*异步)使用IOCP李>Socket
- TPL是实现多线程的一种简单而健壮的方法李>
- 如果您想要异步-那么您应该为请求处理创建一个任务。可能除了“已知”为轻量级的请求之外李>
- 如果您在创建长时间运行的任务时同时有数百个或数千个请求,那么您可能会得到使系统瘫痪的线程数。需要时可以使用长跑。使用自定义
进行并发控制李>TaskScheduler
- 队列将不可避免地出现在您的代码中:用于批处理作业以避免退出锁定和上下文切换,或者在生产者-消费者场景中李>
- 某些资源(SQL Server、文件系统…)具有也使用IOCP的异步API。有些资源没有。在前一种情况下,fromsync将有效地使用IOCP。但请注意,IOCP线程池也不是无限的:它可能会被数据库查询和网络服务耗尽李>
- 如果可能的话-通过实现应用内缓存来避免数据库访问
(.NET
或custom)或批处理不支持的DB请求 需要响应(例如,进行批量插入)李>MemoryCache
- 有一个开源库 部分成为.NET4.5Async的一部分。所以你可以有尼特第三方物流 .NET4.0中的扩展。参观
c#异步套接字服务器有很多幼稚和有缺陷的实现。阅读,但要重新检查。我认为你的问题太笼统了,无法正确回答。你问了很多问题,我想大多数问题的答案都是“视情况而定”。另外,如果你想异步,我真的会考虑使用.NET 5的C ^ 4.5,或者至少使用C .NET 5的.NET 4和.NET 4。它的建设性如何不如?非常好的链接,谢谢。更新了Chris Mullins帖子的链接。添加了ParallelExtensionsExtras参考