Smalltalk Seaside:CannotDeleteFileException:无法删除旧版本的fuel文件
在pharo seaside应用程序的主页按钮中,单击所有数据将保存在一个燃料文件中,其中一些类名为Test.fl。如果我在两个实例中一次调用同一主页,两个实例都调用下面的代码来保存Test.fl文件和最新更新Smalltalk Seaside:CannotDeleteFileException:无法删除旧版本的fuel文件,smalltalk,pharo,seaside,Smalltalk,Pharo,Seaside,在pharo seaside应用程序的主页按钮中,单击所有数据将保存在一个燃料文件中,其中一些类名为Test.fl。如果我在两个实例中一次调用同一主页,两个实例都调用下面的代码来保存Test.fl文件和最新更新 FLSerializer serialize: self allObjects toFileNamed: self name , '.fl'** 以及获得异常: CannotDeleteFileException:无法删除文件的旧版本…\Pharo3.0\Test.fl
FLSerializer
serialize: self allObjects
toFileNamed: self name , '.fl'**
以及获得异常:
CannotDeleteFileException:无法删除文件的旧版本…\Pharo3.0\Test.fl
我使用互斥来允许在第一个实例之后执行另一个实例
mutexBlock := Mutex new.
mutexBlock critical: [
FLSerializer
serialize: self allObjects
toFileNamed: self name , '.fl' ]
但我还是犯了同样的错误
CannotDeleteFileException:无法删除文件的旧版本
请任何人帮我解决这个错误。你的直觉可能是正确的:两个进程试图同时写入(删除)同一个文件。但是,您的
Mutex
方法将不起作用,因为每次执行该代码时都会创建一个新的Mutex
。您必须将Mutex
存储在类或实例变量中(取决于代码的工作方式),这样每个进程都将使用Mutex
的相同实例
您的代码将如下所示:
MyClass class>>serializeProtect
^ SerializeProtect ifNil: [ SerializeProtect := Mutex new ]
self class serializeProtect critical: [
FLSerializer
serialize: self allObjects
toFileNamed: self name , '.fl' ]
注意:延迟初始化互斥锁通常是不安全的。我只是为了简单起见才在这里使用它。那里不需要互斥。Seaside in Pharo一次处理一个请求。也就是说,这仅在文件写入速度快时有效,因为所有其他连接都在等待写入完成。如果不是,则需要在单独的线程中编写,然后控制对它的访问它正在工作。我获取了一个类变量,并在类的initialize方法中初始化了它。谢谢你,麦克斯。很高兴我能帮上忙。