2010-02-04 197 views
1

我们希望在我们的商店中替换POS软件的当前更新系统。目前,我们的网络服务器上有一个文件夹,其中包含我们的注册每30分钟左右调用的脚本。他们传递他们当前的版本号,服务器返回一个XML响应,其中包含需要更新的任何文件,哈希以及用于寄存器下载更新文件的任何其他相关信息。多线程更新服务器

我们需要一个服务来监听我们发送的UDP数据包,以便触发更新。这将防止寄存器不必要地轮询更新。我们正在编写一个更新服务器,它将侦听来自机器的TCP连接,进行身份验证,执行一些日志记录,然后发送已更改文件的更新。我们希望转移到自定义更新服务器,因为我们需要在某些机器上发布POS版本,以便在公司发布之前进行测试后进行试运行。

我已经编写了处理传入连接的代码,并创建了一个新线程来处理与该客户端的通信等,但是我很难用多线程方式处理文件I/O。

我敢肯定,如果它已经在另一个线程中打开,我将无法通过从一个线程打开它来访问文件。我不想将这些文件读入内存,并且事先将它们保存在线程安全的容器中,因为这会占用大量内存,特别是如果事实证明我需要为每个线程保留一份副本以避免线程问题。

如何在不使用大量内存或导致线程等待其他线程完成文件的情况下以线程安全的方式从磁盘/内存访问这些文件的最佳方式是什么?

编辑:忘了提及我们正在使用C#。

+0

这听起来像我需要的是一个数据库或Web服务。 – Nate 2010-02-04 22:44:19

回答

2

多个线程可以打开一个文件。只需正确设置你的文件模式。

如果两个线程尝试打开文件的读/写句柄,将会出现错误(至少在Windows上)。

+0

这有助于了解,因为我们只需要从文件中读取。我只是想确保在跳入文件I/O部分之前,它不会导致打开文件以供从多个线程读取的问题。 – Matt 2010-02-04 22:56:43

1

See C# async IO documentation.

正在改变的文件吗?为什么你不能从单独的线程读取它们?通常可以在单独的线程中两次打开一个文件。但不要指望你的写/读命令。

如果寄存器错过更新会发生什么情况,因为它可能会发生UDP更新通知?你可能应该至少继续至少进行民意调查。

它听起来就像你重塑一个Web服务器...如果它是唯一可以读取网络服务器acheive同样的效果(TCP连接,记录,文件传送)的正确配置

0

Windows具有可能感兴趣的TransmitFile函数。这样你可以让操作系统为你处理任何缓存。这是一个C调用,但从C++/CLI项目中使用它应该相当容易。该调用可以使用重叠的io异步完成。

这样Windows缓存管理器读取文件并在套接字上发送数据,而不必触碰数据。该功能旨在通过套接字进行高性能文件数据传输。

只需打开文件,保存缓存文件的句柄(以便您不需要一次又一次地打开它们),并调用TransmitFile在连接的套接字上发送它们。您需要在服务器操作系统上才能正常工作(客户端操作系统版本上的传输限制)。