C# 块IDisposable.Dispose自线程安全方法
我正在使用一个管理游戏内容的类,我想知道如何在不锁定共享dispose锁的情况下阻止对dispose方法的调用?worker方法本身是线程安全的,可以并行执行,这就是为什么我不想用dispose方法在触发时试图获取的共享锁来锁定这些方法C# 块IDisposable.Dispose自线程安全方法,c#,dispose,finalizer,C#,Dispose,Finalizer,我正在使用一个管理游戏内容的类,我想知道如何在不锁定共享dispose锁的情况下阻止对dispose方法的调用?worker方法本身是线程安全的,可以并行执行,这就是为什么我不想用dispose方法在触发时试图获取的共享锁来锁定这些方法 public void DoSomething() { lock (method1Lock) { /* ... */ } } public void Dispose() { lock (method1Lock) lock (method
public void DoSomething()
{
lock (method1Lock) { /* ... */ }
}
public void Dispose()
{
lock (method1Lock)
lock (method2Lock)
lock (methodXLock)
{
}
}
在这种情况下是不合适的,因为正如我前面提到的,这些方法(本例中的DoSomething)可以并行运行。使用
读写器锁。让方法…
代码取读端,Dispose
取写端(独占)。在.Dispose()中阻塞的意义是什么?我想我不明白你为什么要封锁这里。什么是并行运行这些东西?这就是应该在方法运行完成之前阻止执行的事情,而不是试图在这个逻辑层中强制执行运行时构造。你是在传递这些物品的所有权吗?创建实例的人通常应该负责处理它。类似的情况:@Steven实际上,它一点也不臭。它是一个资产加载类,用于加载和缓存资产。在应用程序生命周期结束时,该类本身将在主线程上释放,并由其他线程上的多个其他实例传递和使用。但是,对于一个无痛苦的处理,我需要确保在一个方法的中间线程不被调用。谢谢,这是我一直在寻找的解决方案。你确信在处理对象之前,这些方法实际上已经被调度了吗?也就是说,您知道在一个或多个方法有可能被执行之前不会处理对象吗?@LasseV.Karlsen不,我无法确保调用其中一个方法。如前所述,它是一个资产加载器,虽然不太可能,但可能根本不被使用。