我们正在开发一种复制工具,它可以定期将不同的文件夹从客户端计算机复制到服务器计算机。
当必须复制特定文件夹时,在客户端创建(通过我们的服务模块)复制对象,该对象通过网络将文件夹中存在的文件的内容发送到服务器。在服务器上,创建相应的接收对象(由我们的服务模块),接收文件。
果壳:
客户端抽象 - 复制对象(在自己的线程中运行),其职责是发送文件。 服务器端抽象 - 接收对象(在自己的线程中运行),责任是接收内容并创建/更新文件。
现在我们需要一些额外的要求,我们需要某些计数器,例如发送的总字节数,接收的总字节数,最后一次复制时间,......对于每个复制的文件夹。只要我们的服务正在运行,这些计数器就需要保持不变(不需要在我们的服务/机器重新启动时保持这种状态)。
为了纳入这些变化,我们正在讨论两种方法。
请注意 - 需要跨复制周期维护计数器。
Approach1 :对象重用
使计数器成为复制的一部分,接收对象并使接收和复制对象保持活动状态,只要服务处于活动状态即可。 现在,对于该主题,可以采取以下任何一种方法。
保持对象和线程处于活动状态(线程进入休眠状态)。现在,在下一个复制周期中,重用对象和线程(唤醒线程)。
允许线程退出,持久保存复制的接收对象。现在在下一个复制周期中;复制,接收对象重新创建一个线程或从线程池中获取一个线程。
Approach2 :封装
将计数器封装在单独的类中。现在每当实例化接收/复制对象以复制文件夹时。
OR
在approach1&方法2更好,为什么?
答案 0 :(得分:0)
我会选择第二种方法。考虑一次复制多个文件的情况。您当前的设计已经支持此功能,只是使用其复制对象生成另一个线程。
如果你选择第二个路径,你仍然可以让计数器对象保留在主线程中,从工作线程接收信号以更新计数器。但是,第一种方法不支持这种情况。
另一种情况:计数的实时视图。如果你有一个gui或任何提供当前数据速率等的东西,它不应该在工作线程中运行。无论如何,你必须向gui线程发出信号。在那个地方完成计数已经很方便。
总结一下:对我而言,在你的情况下,第二种方法似乎是更灵活的方法。它也是对当前设计引入较少更改的那个(您仍然可以丢弃对象并保持每个复制都有自己的对象范例)。