protected override void OnAppearing() { _discoveryService = new DiscoveryService(); _discoveryService.OnDevice += async(sender, device) => _devicesSource.Add(await TargetDevice.FromDiscoveredDeviceAsync(device.DiscoveredDevice)); _discoveryService.OnDeviceDisconnect += (sender, device) => _devicesSource.RemoveMany(_devicesSource.Items.Where(x => x.Usn == device.DiscoveredDevice.Usn)); base.OnAppearing(); }
private Task SearchAsync() { Device.BeginInvokeOnMainThread(() => { ViewModel.Device = "Searching"; }); var tcs = new TaskCompletionSource <bool>(); Task.Run(async() => { using (var discoveryService = new DiscoveryService()) using (var observer = new AnonymousObserver <DeviceAvailableEventArgs>(async e => { State.PreviousDevice = await TargetDevice.FromDiscoveredDeviceAsync(e.DiscoveredDevice); tcs.SetResult(true); })) { var pipeline = Observable .FromEventPattern <DeviceAvailableEventArgs>( handler => discoveryService.OnDevice += handler, handler => discoveryService.OnDevice -= handler ) .Select(x => x.EventArgs); if (State.PreviousDevice == null) { pipeline = pipeline .Take(1); } if (State?.PreviousDevice?.Usn != null) { pipeline = pipeline .Where(x => x.DiscoveredDevice.Usn == State.PreviousDevice.Usn) .Take(1); } pipeline.Subscribe(observer); await discoveryService.SearchAsync(); tcs.SetResult(true); } }); return(tcs.Task); }