【问题标题】:Concurrency Issue on IO operationIO 操作的并发问题
【发布时间】:2011-12-21 12:46:44
【问题描述】:

我正在编写一个多线程控制台应用程序,它从 Web 下载 pdf 文件并将其本地复制到我们的内容服务器位置(Windows 服务器)。这也是将文件提供给我们网站的同一位置。 我对这种方法持怀疑态度,因为存在并发问题,例如,如果网站上的用户从内容服务器请求 pdf 文件,同时控制台应用程序正在写入或更新该文件,则可能存在一个 IO 异常。 (如果原始内容随时间变化,应用程序也会更新 pdf 文件) 有没有办法控制并发问题?

【问题讨论】:

  • 在控制台应用程序完成下载之前,用户如何知道文件?
  • 好吧...该应用程序运行多次,并根据对原始 pdf 的更新来更新现有文件。因此,如果用户正在访问控制台应用程序尝试更新的特定文件,则会发生 IO 异常并且文件不会更新
  • 关于下载:您最好下载到一个位置,然后将文件移动到另一个位置,以便在完全下载后提供它们。
  • 为什么抛出 IOExcpetion 会是一件坏事?
  • 如果抛出异常,我将无法更新 pdf,这是一件坏事。有没有办法让线程等待文件上的 IO 操作完成然后做它的事情?

标签: c# .net windows concurrency io


【解决方案1】:

详细信息取决于您使用的网络服务器软件,但解决此问题的关键是为文件的每个版本赋予不同的名称。请注意,相同的 URL,但在底层文件系统上的名称不同。

准备好新版本的文件后,更改 Web 服务器的配置,使 URL 指向新文件。在任何功能合理的 Web 服务器中,这应该是一个原子操作。

如果网络服务器对此没有内置支持,您可以通过自定义服务器端脚本提供文件。

【讨论】:

    【解决方案2】:

    您可能希望创建和更新文件的操作是原子的,以便处理这些文件的任何其他进程获得正确的版本,而不是仍然可以写入的版本。

    您可以将它们写入一个临时目录,然后将它们移动到将提供它们的目录中,而不是将文件实际写入它们将被提供的位置。

    同样,为了更新它们,您应该检查当您的应用程序更新这些 pdf 文件时,文件本身在写入完成之前不会更改。例如,您可以通过让应用程序在开始写入文件后休眠来测试这一点。

    【讨论】:

    • 我同意...我讨厌在这个项目的阶段改变设计,但我是为了做正确的事。感谢您的回复。
    • 最好更改设计并修复一些错误,而不是交付一个充满最终用户会看到的错误的产品,对吗?希望您的代码不会与您将要编写这些文件的位置紧密耦合。如果是这样,您可能需要考虑让这些事情更容易更改。如果可以的话,将它们放入您的应用程序配置中。
    • 是的......这是真的!我确实将所有位置信息存储在 app.config 中。我总是尝试完成正确的事情,即使这意味着发布稍晚......无论如何......在这种情况下......我正在将所有文件写入临时文件夹,并且在所有线程完成处理后,将它们全部复制到他们各自在内容服务器中的文件夹结构......我认为这将是一个更好的方法。有什么意见/建议??
    【解决方案3】:

    将文件标记为隐藏,直到复制或更新完成。

    【讨论】:

      猜你喜欢
      • 2011-06-01
      • 2018-09-11
      • 1970-01-01
      • 1970-01-01
      • 2021-12-23
      • 1970-01-01
      • 1970-01-01
      • 2016-06-11
      • 1970-01-01
      相关资源
      最近更新 更多