当前位置: 首页 > news >正文

在 Visual Studio 2019 (16.5) 中查看托管线程正在等待的锁被哪个线程占用

Visual Studio 2019 (16.5) 版本更新中带来了一项很小很难注意到却非常实用的功能,查看哪一个托管线程正在持有 .NET 对象锁。

如果你不了解这个功能如何使用,那么可以阅读本文。


@TOC

更新日志

Visual Studio 的官方更新日志中对此功能的描述:

View which managed thread is holding a .NET object lock

即“查看托管线程正在持有 .NET 对象锁”。

功能入口

这个功能没有新的入口,你可以在“调用堆栈” (Call Stack) 窗口,“并行堆栈” (Parallel Stacks) 窗口,以及“线程”窗口的位置列中查看哪个托管线程正在持有 .NET 对象锁。

Call Stack

示例

现在我们就实际看一下这个功能的用法和效果。于是我写了一点下面的代码。

static void Main(string[] args)
{
    var locker = new object();

    Thread thread = new Thread(() =>
    {
        Console.WriteLine("后台线程尝试获得锁");
        lock (locker)
        {
            Console.WriteLine("后台线程成功获得锁");
        }
    })
    {
        Name = "walterlv thread",
    };

    Console.WriteLine("主线程尝试获得锁");
    Monitor.Enter(locker);
    Console.WriteLine("主线程成功获得锁");

    thread.Start();
}

在这段代码中,主线程获得锁之后直接退出,而新线程“walterlv thread”则尝试获得锁。

现在在 Visual Studio 2019 中运行这段代码,可以看到另一个线程是不可能获得锁的,于是不会输出最后那一句,其他都会输出。

锁

随后我们在 Visual Studio 中点击“全部中断”,也就是那个“暂停”图标的按钮。

全部中断

打开调用堆栈窗口(在“调试 -> 窗口 -> 调用堆栈”),可以看到堆栈最顶端显示了正在等待锁,并且指出了线程对象。

正在等待某个线程的锁

然后在线程窗口(在“调试 -> 窗口 -> 线程“)的位置列,鼠标移上去可以看到与堆栈中相同的信息。

在线程窗口中查看

当然,我们的主线程实际上早已直接退出了,所以正在等待的锁将永远不会释放(除非进程退出)。

同样的信息,在并行堆栈(在“调试 -> 窗口 -> 并行堆栈”)中也能看到。

在并行堆栈中查看


参考资料

  • Visual Studio 2019 version 16.5 Release Notes - Microsoft Docs
  • Visual Studio 2019 version 16.5 is now available - Visual Studio Blog

我的博客会首发于 https://blog.walterlv.com/,而 CSDN 会从其中精选发布,但是一旦发布了就很少更新。

如果在博客看到有任何不懂的内容,欢迎交流。我搭建了 dotnet 职业技术学院 欢迎大家加入。

知识共享许可协议

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名吕毅(包含链接:https://walterlv.blog.csdn.net/),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系。

相关文章:

  • 将 Windows Terminal 作为外部工具集成到其他工具 程序 代码中
  • Unity3D 入门:在 Visual Studio 里使用 Visual Studio Tools for Unity 全套工具
  • .NET C# 使用 SetWindowsHookEx 监听鼠标或键盘消息以及此方法的坑
  • .NET WebClient 类下载部分文件会错误?可能是解压缩的锅
  • Unity3D 入门:为 Unity 的 C# 项目添加 dll 引用或安装 NuGet 包
  • .NET 的静态构造函数是否线程安全?答案是肯定的!
  • 如何在终端和 PowerShell 中将一个命令自动重复执行多次
  • WPF:无法对元素“XXX”设置 Name 特性值“YYY”。“XXX”在元素“ZZZ”的范围内,在另一范围内定义它时,已注册了名称。
  • 一点点从坑里爬出来:如何正确打开 WPF 里的 Popup?
  • Windows Linux 系统中获取端口被哪个应用程序占用
  • 设置用户无需密码自动登录到 Windows 系统
  • 最简单的代码,让 WPF 支持响应式布局
  • 当无边框窗口被子窗口遮挡导致难以调节窗口大小时,可通过处理 NCHITTEST 消息重新支持调节窗口大小
  • 如何给 GitHub Pages 配置多个域名?
  • 通过子类化窗口(SubClass)来为现有的某个窗口添加新的窗口处理程序(或者叫钩子,Hook)
  • ➹使用webpack配置多页面应用(MPA)
  • Android单元测试 - 几个重要问题
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • CSS魔法堂:Absolute Positioning就这个样
  • download使用浅析
  • ECMAScript入门(七)--Module语法
  • input实现文字超出省略号功能
  • javascript 总结(常用工具类的封装)
  • JavaScript服务器推送技术之 WebSocket
  • node.js
  • Vue--数据传输
  • Work@Alibaba 阿里巴巴的企业应用构建之路
  • 工程优化暨babel升级小记
  • 全栈开发——Linux
  • 深度学习入门:10门免费线上课程推荐
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • 数组大概知多少
  • 微信公众号开发小记——5.python微信红包
  • 追踪解析 FutureTask 源码
  • TPG领衔财团投资轻奢珠宝品牌APM Monaco
  • (11)MSP430F5529 定时器B
  • (done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW
  • (iPhone/iPad开发)在UIWebView中自定义菜单栏
  • (八)Flask之app.route装饰器函数的参数
  • (七)c52学习之旅-中断
  • (强烈推荐)移动端音视频从零到上手(上)
  • (三)Hyperledger Fabric 1.1安装部署-chaincode测试
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • **CI中自动类加载的用法总结
  • .NET(C#、VB)APP开发——Smobiler平台控件介绍:Bluetooth组件
  • .NET/C# 检测电脑上安装的 .NET Framework 的版本
  • .NET版Word处理控件Aspose.words功能演示:在ASP.NET MVC中创建MS Word编辑器
  • .NET开发不可不知、不可不用的辅助类(三)(报表导出---终结版)
  • .Net中间语言BeforeFieldInit
  • /etc/apt/sources.list 和 /etc/apt/sources.list.d
  • @Autowired多个相同类型bean装配问题
  • @EnableConfigurationProperties注解使用
  • @Pointcut 使用
  • @transaction 提交事务_【读源码】剖析TCCTransaction事务提交实现细节
  • [2019.2.28]BZOJ4033 [HAOI2015]树上染色