我正在开发一些实用程序来控制游戏服务器的线程,并且正在尝试使用IDisposable“令牌”,这样我就可以使用如下代码:
using(SyncToken playerListLock = Area.ReadPlayerList())
{
//some stuff with the player list here
}我的想法是,我在一个区域的玩家列表上获取一个读锁,当它超出using块的作用域时,它会自动解锁。到目前为止,所有这些都已实现并正常工作,但我担心调用Dispose()的时机。
当程序离开using块并随后被垃圾收集器清除时,SyncLock变量是否只是被标记为要处理?还是当前线程执行Dispose()方法作为离开using块的一部分?
这个模式基本上是RAII,其中锁是被分配的资源。Jon Skeet在他的MiscUtils here中也使用了这种模式的一个示例(即,使用IDisposable“令牌”
发布于 2011-06-09 22:11:11
它在using作用域退出后立即被清除。
实际上,这就是
using(SyncToken playerListLock = Area.ReadPlayerList())
{
//some stuff with the player list here
}是语法上的糖,
IDisposable playerListLock;
try {
playerListLock = Area.ReadPlayerList();
}
finally {
if (playerListLock != null) playerListLock.Dispose();
}using的真正目的是在C#中启用类似RAII的功能,该功能不具有确定性销毁功能。
发布于 2011-06-09 22:13:11
当您退出using的作用域时,将调用Dispose。语法糖:
MyObj instance = null;
try
{
instance = new MyObj();
}
finally
{
instance.Dispose();
}发布于 2011-06-09 22:11:15
当using块退出时,会立即调用Dispose()。
using或多或少相当于C++中的RAII习惯用法的C#等价物。
https://stackoverflow.com/questions/6294108
复制相似问题