背景:防止嵌套建立使用互斥
我使用XNA,并有一个清单处理器,将整理所有资产在我的内容项目,通过这些分类(其中包括)其内置的类型。要做到这一点,我需要建立它们。其中一些资产具有自己使用清单的处理器,这意味着资产处理器试图调用清单处理器,所以我得到永无止境的递归。
问题:
我试图使用名为Mutex
当项目打造的是递归来检测并抛出一个错误,这是其他地方处理,但它不能正常工作。
代码:正确使用Mutex类我
public class ManifestProcessor : ContentProcessor<ContentManifestAsset, ContentManifestContent>
{
private static Mutex _LockingMutex = new Mutex(false, "ManifestProcessor");
public override ContentManifestContent Process(ContentManifestAsset input, ContentProcessorContext context)
{
// If we've already locked on this object then we're doing a build as a result of building some other asset, so throw an exception
if (!_LockingMutex.WaitOne(0))
{
throw new NestedManifestBuildException();
}
else
{
try
{
// Stuff that might cause this method to get
// invoked again (via reflection)
}
finally
{
_LockingMutex.ReleaseMutex();
}
}
是谁?如何检测递归调用Process
?
什么样的情况下产生无尽的递归?如果可重用组件正在构建两次,则可以实现某种构建缓存并检查它。如果有某种循环引用,那么就需要对此进行检测。 – Romoku
构建清单的过程的一部分需要构建所有其他资产。建立特定资产的过程需要建立清单。即他们互相呼叫。我意识到我有一个循环依赖意味着什么都不能建立,但我可以解决这个问题。我想检测递归,而不是在打开文件时采取IOException(这是我最初发现它的方式)。 –
缓存应该肯定有帮助。您应该在管道中引入BuildStack以跟踪哪些资产正在构建中,这将解决您的递归问题。 – Romoku