在C#中创建MultiClient服务器时,我可以想到几种方法来划分线程之间的工作。
对于这个问题,假设服务器接受来自客户端的传入TCP连接,并且每个客户端都发送一个文件供服务器存储在HardDrive上。
工作部门1: 每个客户的线程: 服务器将为每个连接的新客户端实例化一个新线程, 该线程将负责该客户端。 (那些线程,除了1“服务器线程”)
工作部门2: 每个资源的线程: 将有1个线程用于处理通信, 和1个用于写入硬盘的线程。 客户端对象将在每个这些Resource-Responsible线程之间传递,每个Resource-Responsible线程都有自己的队列,因此它可以知道它应该做什么。 (再次,这些线程是1“服务器线程”的补充)
工作部门3: 主任务的每个子任务的线程: 让我们将每个连接客户端需要做的工作称为“主要任务”。 所以我们将这些主要任务分解为几个子任务, 并为每个子任务创建一个线程, 并且每个线程将有一个队列来保存它应该处理的客户端项。 (这听起来类似于第2部分,但在另一个具有不同工作而不是文件接收服务器的项目中,这种类型的划分可能与第2部分完全不同)
我的问题是:
是否还有其他方法可以在线程之间划分工作?
答案 0 :(得分:1)
答案是,除非连接客户端很少,否则根本不使用线程。原因是线程带来了开销,并且由于您使用缓慢的资源(IO),线程将在很长一段时间内处于空闲状态。
相反,你应该看看异步编程。在dotnet中你有三个模型:
https://msdn.microsoft.com/en-us/library/jj152938(v=vs.110).aspx
APM是最古老的一个。如果您的dotnet版本不支持EAP或TAP,我只推荐它。但在您的情况下,您需要使用APM(.NET 2.0)并可以在此处阅读更多相关信息:https://msdn.microsoft.com/en-us/library/ms228963(v=vs.110).aspx当您使用异步编程时,您不必再担心线程了。 .NET和操作系统将管理线程。您的申请将会“清醒”#34;在您已经订购的IO操作中完成某些操作时(例如通过套接字发送内容或从数据库中读取内容)。
我想使用Thread类实现所选择的解决方案,而不是使用.NET框架中的其他类/工具。
只有#1是可行的。写入磁盘将比通过网络接收文件更快。所以没有理由让资源拥有线程。
使用#1还可以降低复杂性并使代码更易于阅读。您仍然需要一项服务来确保两个客户端不能使用同一个文件。