Определение наличия подключения к устройству связи


Я не уверен, если я использую монитор.Ждать и следить.Пульс является правильным. Это, кажется, работало хорошо, но есть сомнение что я делаю что-то неправильно.

Я имею дело с тайм-аутом ОК, или есть ли лучший способ сделать это?

Все примеры, которые я видел использовать монитор.Подождать С то время как цикл, а не с если повторно проверяем условие блокировки после импульса, но мне нужно определить, если тайм-аут произошел.

_cmdDispatcher.EnqueueCommand(УМК) посылает команду на устройство, и он реагирует с события, которое выполняет CommResponseReceived метод в другом потоке.

private readonly object _connectLock = new object();

public bool Connect()
{
    if (this._connected) throw new InvalidOperationException("Plc is already connected.");

    ICommand cmd = new Command(MessageIdentifier.Name);

    try
    {
        if (this._channel.Open() && !this._connected)
        {
            // Wait for communications to be fully established or timeout before continuing.
            lock (this._connectLock)
            {
                this._cmdDispatcher.EnqueueCommand(cmd);

                if (!this._connectSignal)
                {
                    if (Monitor.Wait(this._connectLock, this._timeout))
                    {
                        this._connected = true;
                        this._connectSignal = false;
                        Debug.WriteLine("Connection succeeded.");
                    }
                    else
                    {
                        //TODO Log timeout.
                        Debug.WriteLine("Connection timed out.");
                    }
                }
            }

            if (this._connected) this.OnConnectionChangedEvent(ConnectionStatus.Connected);
        }
    }
    catch (Exception ex)
    {
        //TODO Log errors.
        Debug.WriteLine("Connection failed.");
    }

    return this._connected;
}

Выполняется в другом потоке, когда устройство отвечает:

private void CommResponseReceived(object sender, CommsResponseEventArgs e)
{
    //

    // Signal that communications are successfully established.
    lock (this._connectLock)
    {
        this._connectSignal = true;
        Monitor.Pulse(this._connectLock);
    }
}


16350
20
задан 24 января 2011 в 08:01 Источник Поделиться
Комментарии