Task<ControlClient> ConnectAsync (IAdapter adapter) { var tcs = new TaskCompletionSource<ControlClient> (); adapter.DeviceDiscovered += (object sender, DeviceDiscoveredEventArgs e) => { Device.BeginInvokeOnMainThread(async () => { // Look for a specific device if (e.Device.ID.ToString ().StartsWith ("af18", StringComparison.OrdinalIgnoreCase)) { // Connect to the device await adapter.ConnectAsync (e.Device); // Establish the control client using (var stream = new LEStream (e.Device)) { var client = new ControlClient (stream); client.RunAsync (CancellationToken.None); // Don't await to run in background tcs.SetResult (client); } // Update the UI connectLabel.Text = "Yay " + e.Device + "!"; } }); }; adapter.StartScanningForDevices(); return tcs.Task; }
async Task RunControlAsync () { var cts = new CancellationTokenSource (); try { var device = await ConnectAsync (); using (var s = new LEStream (device)) { client = new ControlClient (s); variablesList.ItemsSource = client.Variables; commandsList.ItemsSource = client.Commands; await client.RunAsync (cts.Token); } } catch (Exception ex) { Debug.WriteLine ("Stream failed"); Debug.WriteLine (ex); } finally { client = null; } }