【问题标题】:Watch window timeout when using ReaderWriterSlimLock in properties在属性中使用 ReaderWriterSlimLock 时观察窗口超时
【发布时间】: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


【解决方案1】:

我猜这是因为线程在调用 unmanaged 代码时可以 获取这个锁,如果你只是点击就会发生这种情况调试器的暂停按钮。

同步机制将挂起,直到线程重新进入托管环境。因此,这可以解释当您暂停时 EnterReadLock 的超时 - 后面没有 F10

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-20
    • 2020-04-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-12
    • 1970-01-01
    • 2017-03-20
    相关资源
    最近更新 更多