我不明白为什么相同的代码在 32 位系统上成功运行,但尝试在 64 位系统上运行它,总是报错:
文件正被另一个进程使用
我声明了一个文件观察者事件来观察文件的变化。
我的代码类似于下面:
static void Main()
{
//init load file
LoadAssembly(dll);
//bind watching event.
FileSystemWatcher watcher = new FileSystemWatcher(rootPath, "*.dll");
watcher.NotifyFilter = NotifyFilters.CreationTime | NotifyFilters.LastWrite;
watcher.Changed += new FileSystemEventHandler(TemplateFile_Changed);
watcher.IncludeSubdirectories = false;
watcher.EnableRaisingEvents = true;
}
private LoadAssembly(assemblyFile)
{
try
{
using (FileStream fs = new FileStream(assemblyFile, FileMode.Open, FileAccess.Read, FileShare.Read))
{
//read a file and write to memorystream.
......
fs.Close();
fs.Dispose();
}
asm = Assembly.Load(ms.ToArray());
}
finally
{
ms.Close();
}
}
private void TemplateFile_Changed(object sender, FileSystemEventArgs e)
{
lock (_sync)
{
LoadAssembly(e.FullPath);
}
}
我测试可以在 32 位系统中运行的代码(在我的计算机中)。当我部署到 64 位系统时,当我更改文件并告诉应用程序需要重新加载此文件时,总是得到一个
另一个进程正在使用文件`
在
using (FileStream fs = new FileStream(assemblyFile, FileMode.Open, FileAccess.Read, FileShare.Read))
更新-1
好吧,感谢@Hans Passant 的回答,这个异常看起来是由触发更改事件并仍然保持文件打开的文件观察程序引起的。我在我的 TemplateFile_Changed 中添加了一个 Thread.Sleep() 看起来解决了这个问题。
private void TemplateFile_Changed(object sender, FileSystemEventArgs e)
{
lock (_sync)
{
Thread.Sleep(2000);
LoadAssembly(e.FullPath);
}
}