内容简介:Visual Studio 2019 (16.5) 版本更新中带来了一项很小很难注意到却非常实用的功能,查看哪一个托管线程正在持有 .NET 对象锁。如果你不了解这个功能如何使用,那么可以阅读本文。Visual Studio 的官方更新日志中对此功能的描述:
Visual Studio 2019 (16.5) 版本更新中带来了一项很小很难注意到却非常实用的功能,查看哪一个托管线程正在持有 .NET 对象锁。
如果你不了解这个功能如何使用,那么可以阅读本文。
更新日志
Visual Studio 的官方更新日志中对此功能的描述:
View which managed thread is holding a .NET object lock
即“查看托管线程正在持有 .NET 对象锁”。
功能入口
这个功能没有新的入口,你可以在“调用堆栈” (Call Stack) 窗口,“并行堆栈” (Parallel Stacks) 窗口,以及“线程”窗口的位置列中查看哪个托管线程正在持有 .NET 对象锁。
示例
现在我们就实际看一下这个功能的用法和效果。于是我写了一点下面的代码。
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
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 关于 Java 单线程经常占用 CPU 100% 的分析
- 原 荐 java计算对象占用内存大小:lucene专用于计算堆内存占用大小的工具类
- .NET/C# 如何获取当前进程的 CPU 和内存占用?如何获取全局 CPU 和内存占用?
- mariadb 内存占用优化
- MariaDB内存占用优化
- 清理docker占用空间
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。