【问题标题】:Multi-Threaded Update Server多线程更新服务器
【发布时间】:2010-02-04 22:34:16
【问题描述】:

我们希望更换我们商店当前的 POS 软件更新系统。目前,我们的网络服务器上有一个文件夹,其中托管了我们的寄存器每 30 分钟左右调用一次的脚本。它们传入当前版本号,服务器返回一个 XML 响应,其中包含任何需要更新的文件、散列和任何其他相关信息,以便注册者下载更新的文件。

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

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

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

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

编辑:忘了说我们使用的是 C#。

【问题讨论】:

  • 在我看来,您需要的是数据库或网络服务。

标签: c# multithreading file-io


【解决方案1】:

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

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

【讨论】:

  • 这很有帮助,因为我们只需要从文件中读取。我只是想在进入文件 I/O 部分之前确保打开文件以从多个线程读取不会导致问题。
【解决方案2】:

See C# async IO documentation.

文件有变化吗?为什么你不能从不同的线程中读取它们?您通常可以在不同的线程中打开一个文件两次。但不要期望您的写入/读取是有序的。

如果寄存器错过更新会发生什么,就像 UDP 更新通知一样?你应该至少不时地继续投票。

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

【讨论】:

    【解决方案3】:

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

    这样,Windows 缓存管理器读取文件并在套接字上发送数据,而您根本无需接触数据。该函数旨在通过套接字进行高性能文件数据传输。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-24
      • 2015-08-11
      • 2019-01-20
      • 2019-05-27
      • 2015-02-10
      • 2014-03-24
      相关资源
      最近更新 更多