首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C#中将' Using‘与线程实用程序一起使用-何时调用Dispose?

在C#中将' Using‘与线程实用程序一起使用-何时调用Dispose?
EN

Stack Overflow用户
提问于 2011-06-09 22:07:50
回答 8查看 339关注 0票数 3

我正在开发一些实用程序来控制游戏服务器的线程,并且正在尝试使用IDisposable“令牌”,这样我就可以使用如下代码:

代码语言:javascript
复制
using(SyncToken playerListLock = Area.ReadPlayerList())
{
    //some stuff with the player list here
}

我的想法是,我在一个区域的玩家列表上获取一个读锁,当它超出using块的作用域时,它会自动解锁。到目前为止,所有这些都已实现并正常工作,但我担心调用Dispose()的时机。

当程序离开using块并随后被垃圾收集器清除时,SyncLock变量是否只是被标记为要处理?还是当前线程执行Dispose()方法作为离开using块的一部分?

这个模式基本上是RAII,其中锁是被分配的资源。Jon Skeet在他的MiscUtils here中也使用了这种模式的一个示例(即,使用IDisposable“令牌”

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2011-06-09 22:11:11

它在using作用域退出后立即被清除。

实际上,这就是

代码语言:javascript
复制
using(SyncToken playerListLock = Area.ReadPlayerList())
{
    //some stuff with the player list here
}

是语法上的糖,

代码语言:javascript
复制
IDisposable playerListLock;
try {
    playerListLock = Area.ReadPlayerList();
}
finally {
    if (playerListLock != null) playerListLock.Dispose();
}

using的真正目的是在C#中启用类似RAII的功能,该功能不具有确定性销毁功能。

票数 11
EN

Stack Overflow用户

发布于 2011-06-09 22:13:11

当您退出using的作用域时,将调用Dispose。语法糖:

代码语言:javascript
复制
MyObj instance = null;
try
{
  instance = new MyObj();
}
finally
{
  instance.Dispose();
}
票数 3
EN

Stack Overflow用户

发布于 2011-06-09 22:11:15

using块退出时,会立即调用Dispose()

using或多或少相当于C++中的RAII习惯用法的C#等价物。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6294108

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档