【发布时间】:2013-05-20 17:41:46
【问题描述】:
我有一段简单的代码,如下所示:
File.WriteAllBytes(Path.Combine(temp, node.Name), stuffFile.Read(0, node.FileHeader.FileSize));
有人会认为WriteAllBytes 将是一个阻塞调用,因为它在 C# 5.0 中具有异步对应项,并且它在任何 MSDN 文档中都没有说明它是非阻塞的。但是,当文件大小合理(不是很大,但在 20mb 范围内)时,之后打开文件的调用似乎在写入完成之前被调用,并且文件被打开(程序抱怨它已损坏,没错),然后WriteAllBytes 抱怨文件在另一个进程中打开。这里发生了什么?!出于好奇,这是用于打开文件的代码:
System.Diagnostics.Process.Start(Path.Combine(temp, node.Name));
有没有人经历过这种奇怪的事情?还是因为我是金发女郎而做错了什么?
如果确实阻塞,可能是什么原因导致了这个问题?
编辑:我会提出完整的方法。
var node = item.Tag as FileNode;
stuffFile.Position = node.FileOffset;
string temp = Path.GetTempPath();
File.WriteAllBytes(Path.Combine(temp, node.Name), stuffFile.Read(0, node.FileHeader.FileSize));
System.Diagnostics.Process.Start(Path.Combine(temp, node.Name));
似乎正在发生的事情是 Process.Start 在 WriteAllBytes 完成之前被调用,它试图打开文件,然后 WriteAllBytes 抱怨另一个进程持有文件的锁。
【问题讨论】:
-
WriteAllBytes在执行后如何抱怨?您应该在调试器中单步执行以查看实际情况。 -
嗯,这就是我的想法。我会用整个方法更新问题,也许这会有所帮助。
-
如果
Process.Start已经在执行,WriteAllBytes就无法抱怨。即使WriteAllBytes是非阻塞的(它不是),它仍然会在执行下一行代码之前返回,并且一旦函数返回它就无法抱怨。 -
我对 File.WriteAllBytes 有同样的问题。当我用这个函数写一个文件时,它告诉我,这个过程已经完成。但是,如果另一个应用程序在我的应用程序完成后尝试读取此文件 - 文件似乎不存在。如果我调试,文件有足够的时间“出现”,所以在调试时这个工作流程是有效的。如果我在两者之间添加超过 2 秒的延迟,它也可以工作,这是无稽之谈(而且我正在使用 SSD !!!)。我的猜测是,Windows 可以为“更好的体验”进行一些“优化”。