2011-11-03 31 views
2

我正在编写一个多线程控制台应用程序,它从Web下载PDF文件并将其复制到我们的内容服务器位置(Windows服务器)上。这也是将文件传送到我们网站的相同位置。 由于并发性问题,例如网站上的用户从内容服务器请求pdf文件,同时文件正在写入或由控制台应用程序更新,我对此方法持怀疑态度。是一个IO异常。 (如果原始内容随时间变化,应用程序也会更新PDF文件) 有没有办法控制并发问题?IO操作的并发问题

+0

在控制台应用程序完成下载之前,用户将如何知道该文件? – Oded

+0

好吧...应用程序运行多次,并基于原始pdf的更新更新现有文件。因此,如果用户正在访问控制台应用程序试图更新的特定文件,则会发生IO异常并且文件不会更新 – karry

+2

关于下载:您最好下载到一个位置并将文件移动到另一个位置在他们完全下载之后,它们可以在稍后被服务的位置。 – kd7

回答

2

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

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

同样,为了更新它们,你应该检查你的应用程序何时更新那些文件本身没有改变直到写入完成。例如,您可以通过在应用程序开始写入文件后进行睡眠来测试这一点。

+1

我同意......我讨厌在我参与这个项目的阶段改变设计,但我是为了做正确的事情。感谢您的答复。 – karry

+1

更好地更改设计并修复一些错误,而不是发送一个充满最终用户将会看到的错误的产品,对吗?希望你的代码不会太紧密地耦合到你将要写这些文件的位置。如果是这样,你可能想考虑使这些事情更容易改变。如果可以,请将它们放入应用程序配置中。 – tjarratt

+1

是的......这是真的!我确实将所有的位置信息存储在app.config中。无论如何,我总是试着做正确的事情,即使它意味着稍晚的发布......在这种情况下......我正在将所有文件写入临时文件夹,并在所有线程完成处理后,将它们全部复制到内容服务器中各自的文件夹结构....我认为这将是更好的方法。任何coments/suggstions ?? – karry

0

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

1

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

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

如果Web服务器没有内置支持,则可以通过自定义服务器端脚本来提供文件。