多线程更新服务器

时间:2010-02-04 22:34:16

标签: c# multithreading file-io

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

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

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

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

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

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

3 个答案:

答案 0 :(得分:2)

多个线程可以打开文件,如果它只是用于读取。只需正确设置文件模式即可。

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

答案 1 :(得分:1)

See C# async IO documentation.

文件是否在变化?为什么你不能从单独的线程中读取它们?您通常可以在单独的线程中打开两次文件。但是不要指望你的写/读是有序的。

如果寄存器错过了更新会发生什么情况,就像UDP更新通知一样?你可能应该至少不时地继续进行民意调查。

听起来你正在重新发明一个网络服务器...可以正确配置网络服务器,实现相同的效果(TCP连接,日志记录,文件传递)

答案 2 :(得分:0)

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

这样,Windows缓存管理器就会读取文件并在套接字上发送数据,而您根本不需要触摸数据。该函数用于通过套接字传输高性能文件数据。

只需打开文件,保留缓存文件的句柄(这样就不需要反复打开它们)并调用TransmitFile将它们发送到连接的套接字上。您需要在服务器操作系统上才能使该功能正常工作(客户端操作系统版本上的传输存在限制)。