【发布时间】:2017-06-19 13:00:45
【问题描述】:
为什么对于进入 ReaderWriterSlimLock 的任何属性,Visual Studio Watch 窗口都会显示“评估超时”?
要重现问题,请运行以下程序,暂停它并在 Watch 窗口中输入 Form1.form.Prop。
在实际应用中,一旦 Watch 窗口出现“Evaluation timed out”,其他代码就无法再进入锁。
using System;
using System.Collections.Generic;
using System.Threading;
using System.Windows.Forms;
namespace LockTest
{
public partial class Form1 : Form
{
private ReaderWriterLockSlim readerWriterLock = new ReaderWriterLockSlim(LockRecursionPolicy.NoRecursion);
private static Form1 form;
public int Prop
{
get
{
readerWriterLock.EnterReadLock();
readerWriterLock.ExitReadLock();
return 1;
}
}
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
form = this;
}
}
}
【问题讨论】:
-
有趣。如果您在表单的实例方法中放置断点并直接访问属性,则没有问题,只有在没有断点的情况下暂停应用程序时通过静态
form变量访问它。托管线程ID相同...... -
@user1892538 只需单击调试器的暂停按钮。它将停在
MainApplication.Run(new Form1());。然后,当您尝试访问Form1.form.Prop(通过静态字段!)时,就会发生错误。 -
@user1892538 不要使用断点,只需使用调试器启动应用程序,并在显示窗口时单击调试器的暂停按钮。它将在
Application.Run旁边显示绿色箭头,表示当前执行的代码在“内部”。此时Form1_Load已经被执行,form被设置为打开窗口的实例。 -
@user1892538 当我设置此选项时,我收到一条不同的错误消息“无法评估表达式,因为系统框架位于调用堆栈的顶部”(我使用德语 IDE,所以我的翻译是肯定错了)。再一次,我们从不“介入”,我们只是“暂停”。当我“踏入”时,我也能看到价值。
-
这是 VS2015 调试器的损失,非常有问题。每当调试器出现异常时,请始终使用工具 > 选项 > 调试 > 常规 > “使用托管兼容模式”复选框获得第二意见。您现在可以获得更好的诊断结果。
标签: c# properties locking deadlock watch