3

我有以下方法:

public bool ConnectAsync()
{
    if (IsConnected)
        throw new InvalidOperationException("Socket is already connected");

    if (IsConnecting)
    {
        throw new InvalidOperationException("Attempt to connect in progress");
    }

    . . .
}

在哪里:

    private readonly object padLock = new object();

    private bool isConnecting = false;

    public bool IsConnected
    {
        get
        {
            lock (padLock)
            { return socket.Connected; }
        }
    }

    public bool IsConnecting
    {
        get
        {
            lock (padLock)
            { return isConnecting; }
        }

        private set
        {
            lock (padLock)
            { isConnecting = value; }
        }
    }

在此处输入图像描述

如果我的变量 isConnecting 为 false,为什么会执行 if 语句中的代码?

编辑
如果我使用归档isConnecting而不是属性,IsConnecting我有相同的行为。代码在任何地方的同一个线程中运行。

编辑 2

最后这有效:

lock (padLock)
{
    if (IsConnecting)
        throw new InvalidOperationException("Attempt to connect in progress");
}

这有效:

{
    if (IsConnecting)
        throw new InvalidOperationException("Attempt to connect in progress");
}

但为什么?

4

3 回答 3

4

这可能是调试器和多线程的问题,尝试将锁放在 if 语句的外部而不是属性内部。

于 2012-11-02T20:52:04.447 回答
4

您在调试器中的表达式窗口是触发异常的窗口,而不是您的代码。删除表达式(或监视),它应该按预期工作。

于 2012-11-03T03:42:11.973 回答
0

这个答案解释了我遇到的问题: https ://stackoverflow.com/a/27552124/1830461

编译为 64 位的这种格式的某些内容可能会导致调试器单步执行 if 语句:

        if (falseCondition) 
            throw new Exception(); 
        try { }  catch { }

这是 Visual Studio 中的一个错误。代码实际上并未执行。解决方案是忽略它并继续单步执行代码。在它上面加上一个 lock 语句可以修复它,因为它不再是那种格式。

于 2015-12-07T19:31:40.893 回答