private async Task <LoRaDevice> InitializeDeviceAsync(LoRaDevice loRaDevice) { try { // Calling initialize async here to avoid making async calls in the concurrent dictionary // Since only one device will be added, we guarantee that initialization only happens once if (await loRaDevice.InitializeAsync()) { loRaDevice.IsOurDevice = string.IsNullOrEmpty(loRaDevice.GatewayID) || string.Equals(loRaDevice.GatewayID, this.configuration.GatewayID, StringComparison.InvariantCultureIgnoreCase); // once added, call initializers if (this.initializers != null) { foreach (var initializer in this.initializers) { initializer.Initialize(loRaDevice); } } if (!loRaDevice.IsOurDevice) { loRaDevice.Disconnect(); } return(loRaDevice); } } catch (Exception ex) { // device does not have the required properties Logger.Log(loRaDevice.DevEUI ?? this.devAddr, $"error initializing device {loRaDevice.DevEUI}. {ex.Message}", LogLevel.Error); } // instance not used, dispose the connection loRaDevice.Dispose(); return(null); }