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 ステートメント内のコードが実行されるのはなぜですか?

編集:プロパティの代わりに
フィールドを使用すると、同じ動作になります。コードはどこでも同じスレッドで実行されます。isConnectingIsConnecting

編集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

デバッガーにある式ウィンドウは、コードではなく、例外をトリガーするウィンドウです。式 (またはウォッチ) を削除すると、期待どおりに動作するはずです。

于 2012-11-03T03:42:11.973 に答える
4

これはおそらくデバッガーと複数のスレッドの問題です。プロパティ内ではなく、if ステートメントの外側にロックを配置してみてください。

于 2012-11-02T20:52:04.447 に答える