Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在属性中使用ReaderWriterSlimLock时监视窗口超时_C#_Properties_Locking_Deadlock_Watch - Fatal编程技术网

C# 在属性中使用ReaderWriterSlimLock时监视窗口超时

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

为什么对于任何输入ReaderWriterSlimLock的属性,Visual Studio监视窗口都会显示“评估超时”

要重现该问题,请运行以下程序,暂停该程序并在“监视”窗口中输入Form1.form.Prop

在实际应用程序中,一旦“评估超时”出现在监视窗口中,其他代码就不能再进入锁

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
at
Application.Run(newform1())中停止。然后,当您尝试访问
Form1.form.Prop
(通过静态字段!)时,会发生错误。@user1892538不使用断点,只需使用调试器启动应用程序,在显示窗口时,单击调试器的暂停按钮。它将显示
应用程序旁边的绿色箭头。运行
以指示当前执行的代码是“内部”代码。此时,
Form1\u Load
已经执行,并且
form
被设置为打开窗口的实例。@user1892538当我设置此选项时,我收到另一条错误消息“表达式无法计算,因为系统框架位于调用堆栈顶部”(我使用德语IDE,因此我的翻译肯定是错误的)。再说一次,我们从不“介入”,我们只是“暂停”。当我“进入”时,我也可以看到值。这在VS2015调试器中是丢失的,它是非常错误的。每当调试器行为异常时,始终使用“工具”>“选项”>“调试”>“常规”>“使用托管兼容性模式”复选框获取第二种意见。你现在得到了更好的诊断。