private async Task <IDevice?> Initialize(Lock @lock, LockKey key) { if (_adapter.Status != AdapterStatus.PoweredOn) { if (!(_adapter.CanControlAdapterState() && await TurnOnBle())) { await _dialogService.ShowError("Bluetooth anschalten", "Schalten Sie Bluetooth ein, um das Schloss zu bedienen"); return(null); } Task <bool> TurnOnBle() { TaskCompletionSource <bool> bleResult = new TaskCompletionSource <bool>(); _adapter.WhenStatusChanged() .Timeout(MaxTurnOnBluetoothDuration) .Subscribe(status => { if (status == AdapterStatus.PoweredOn) { bleResult.TrySetResult(true); } }, exception => { bleResult.TrySetResult(false); }); try { _adapter.SetAdapterState(true); } catch (Exception) { return(Task.FromResult(false)); } return(bleResult.Task); } } var result = new TaskCompletionSource <IDevice?>(); _adapter.ScanUntilDeviceFound(@lock.Name) .Take(1) .Timeout(MaxScanDuration) .Subscribe(device => { device.WhenConnected().Take(1).Subscribe(async _ => { var success = await Authenticate(key, device); if (success) { result.TrySetResult(device); } else { result.TrySetResult(null); await _dialogService.ShowError("Authentifizierung fehlgeschlagen", "Das Schloss konnte aufgrund eines Fehlers mit der Authentifizierung nicht geöffnet werden."); } }, async exception => { result.TrySetResult(null); await _dialogService.ShowError("Verbindung fehlgeschlagen", "Die Verbindung zum Schloss ist fehlgeschlagen, obwohl das Schloss gefunden wurde."); }); device.Connect(new ConnectionConfig { AutoConnect = false }); }, async exception => { await _dialogService.ShowError("Schloss wurde nicht gefunden", "Das Schloss konnte nicht gefunden werden."); result.TrySetResult(null); }); return(await result.Task); }