C# 在属性中使用ReaderWriterSlimLock时监视窗口超时
为什么对于任何输入ReaderWriterSlimLock的属性,Visual Studio监视窗口都会显示“评估超时” 要重现该问题,请运行以下程序,暂停该程序并在“监视”窗口中输入Form1.form.Prop 在实际应用程序中,一旦“评估超时”出现在监视窗口中,其他代码就不能再进入锁C# 在属性中使用ReaderWriterSlimLock时监视窗口超时,c#,properties,locking,deadlock,watch,C#,Properties,Locking,Deadlock,Watch,为什么对于任何输入ReaderWriterSlimLock的属性,Visual Studio监视窗口都会显示“评估超时” 要重现该问题,请运行以下程序,暂停该程序并在“监视”窗口中输入Form1.form.Prop 在实际应用程序中,一旦“评估超时”出现在监视窗口中,其他代码就不能再进入锁 using System; using System.Collections.Generic; using System.Threading; using System.Windows.Forms; nam
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;
}
}
}
我猜这是因为线程在调用非托管代码时可以不获取此锁,如果只单击调试器的暂停按钮,就会发生这种情况
在线程重新进入托管环境之前,同步机制将处于挂起状态。因此,这可以解释当您点击暂停时,
EnterReadLock
超时的原因,而不是后面跟着F10
有趣。如果您在窗体的实例方法中放置断点并直接访问属性,则没有问题,只有在没有断点的情况下暂停应用程序时,通过静态form
变量访问属性时才会出现问题。托管线程ID是相同的……@user1892538只需单击调试器的暂停按钮。它将在Main
atApplication.Run(newform1())中停止代码>。然后,当您尝试访问Form1.form.Prop
(通过静态字段!)时,会发生错误。@user1892538不使用断点,只需使用调试器启动应用程序,在显示窗口时,单击调试器的暂停按钮。它将显示应用程序旁边的绿色箭头。运行以指示当前执行的代码是“内部”代码。此时,Form1\u Load
已经执行,并且form
被设置为打开窗口的实例。@user1892538当我设置此选项时,我收到另一条错误消息“表达式无法计算,因为系统框架位于调用堆栈顶部”(我使用德语IDE,因此我的翻译肯定是错误的)。再说一次,我们从不“介入”,我们只是“暂停”。当我“进入”时,我也可以看到值。这在VS2015调试器中是丢失的,它是非常错误的。每当调试器行为异常时,始终使用“工具”>“选项”>“调试”>“常规”>“使用托管兼容性模式”复选框获取第二种意见。你现在得到了更好的诊断。