我有一段简单的代码,如下所示:

File.WriteAllBytes(Path.Combine(temp, node.Name), stuffFile.Read(0, node.FileHeader.FileSize));

有人会认为 WriteAllBytes 将是一个阻塞调用,因为它在 C# 5.0 中具有 Async 对应项,并且它没有在任何 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.StartWriteAllBytes 完成之前被调用,并且它试图打开文件,然后 WriteAllBytes 提示另一个进程持有文件上的锁。

最佳答案

不,WriteAllBytes 是一种阻塞的同步方法。正如您所说,如果不是,文档会这样说。

可能是病毒扫描器还在忙着扫描你刚才写的文件,负责锁定文件。尝试暂时禁用扫描仪以测试我的假设。

关于c# - File.WriteAllBytes 不会阻塞,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16746529/

10-13 07:48