/// <inheritdoc/> public async Task SetEndpointAsync(EndpointModel endpoint) { if (endpoint.IsSameAs(Endpoint)) { return; } // Unregister old endpoint if (Endpoint != null) { await _client.UnregisterAsync(Endpoint); _logger.Information("Endpoint {@endpoint} unregistered.", Endpoint); } // Set new endpoint Endpoint = endpoint; // Register callback to report endpoint state property if (Endpoint != null) { await _client.RegisterAsync(Endpoint, state => _events?.SendAsync("State", state)); _logger.Information("Endpoint {@endpoint} registered.", Endpoint); } }
/// <inheritdoc/> public Task SetEndpointAsync(EndpointModel endpoint) { if (!endpoint.IsSameAs(Endpoint)) { // Unregister old endpoint if (Endpoint != null) { _callback?.Dispose(); _callback = null; _session?.Dispose(); _session = null; } // Set new endpoint Endpoint = endpoint; // Register callback to report endpoint state property if (Endpoint != null) { var connection = new ConnectionModel { Endpoint = Endpoint }; _session = _client.GetSessionHandle(connection); _callback = _client.RegisterCallback(connection, state => _events?.ReportAsync("State", state)); } } return(Task.CompletedTask); }
/// <inheritdoc/> public Task SetEndpointAsync(EndpointModel endpoint) { if (endpoint.IsSameAs(Endpoint)) { return(Task.CompletedTask); } // Unregister old endpoint if (Endpoint != null) { _client.Unregister(Endpoint); } // Set new endpoint Endpoint = endpoint; // Register callback to report endpoint state property if (Endpoint != null) { _client.Register(Endpoint, state => _events?.SendAsync("State", state)); } return(Task.CompletedTask); }
/// <inheritdoc/> public async Task SetEndpointAsync(EndpointModel endpoint) { await _lock.WaitAsync(); try { var previous = _endpoint.Task.IsCompleted ? _endpoint.Task.Result : null; if (!endpoint.IsSameAs(previous)) { _logger.Debug( "Updating twin {device} endpoint from {previous} to {endpoint}...", _events?.DeviceId, previous?.Url, endpoint?.Url); if (_endpoint.Task.IsCompleted) { _endpoint = new TaskCompletionSource <EndpointModel>(); } // Unregister old endpoint if (previous != null) { _callback?.Dispose(); _callback = null; _session?.Dispose(); _session = null; // Clear state State = EndpointConnectivityState.Disconnected; } // Register callback to report endpoint state property if (endpoint != null) { var connection = new ConnectionModel { Endpoint = endpoint }; _session = _client.GetSessionHandle(connection); // Set initial state State = _session.State; // update reported state _callback = _client.RegisterCallback(connection, state => { State = state; return(_events?.ReportAsync("State", state)); }); _logger.Information("Endpoint {endpoint} ({device}, {module}) updated.", endpoint?.Url, _events.DeviceId, _events.ModuleId); // ready to use _endpoint.TrySetResult(endpoint); } _logger.Information("Twin {device} endpoint updated to {endpoint}.", _events?.DeviceId, endpoint?.Url); } } finally { _lock.Release(); } }