private void sendCommands_Click(object sender, RoutedEventArgs e) { if (ourPort == null) { MessageBox.Show("Port is not open!"); } else { Log("---------------- Sending data to copter! ------------------"); Task.Run(() => { try { var toSendArray = ManeuverTrack.ToArray(); var ppmList = new List <Tuple <ManeuverReference, Movement> >(); foreach (var item in toSendArray) { var man = Maneuvers.First(x => x.Uid == item.UidReference); ppmList.AddRange(man.Movements.Select(x => new Tuple <ManeuverReference, Movement>(item, x))); } foreach (var item in ppmList) { if (cancelled) { break; } item.Item1.IsHighlighted = true; tryRefresh(); ourPort.SendData(item.Item2.GetInSerialFormat()); Thread.Sleep(item.Item2.TimeMs); item.Item1.IsHighlighted = false; tryRefresh(); } } catch (Exception ex) { Dispatcher.BeginInvoke((Action)(() => { Log("EXCEPTION sending data to copter! Reason: " + ex.Message); Log("Sending data to copter halted!"); })); } Dispatcher.BeginInvoke((Action)(() => { if (cancelled) { cancelled = false; Log("XXXXXXXXXXXX --- Data sending cancelled --- XXXXXXXXXXX"); } else { Log("-------XXX------ Data sent to copter! --------XXX------"); } })); }); } }