void SetDirection(MotorControllerCom.Direction direction) { Task.Run(() => { bool worked = false; lock ( MotorLock ) { if (MotorCom.Open(MotorComPort)) { MotorCom.SetDirection(direction); MotorCom.Close(); worked = true; } else { Console.WriteLine("failed to SetDirection"); } } if (worked) { string dir_string = "ERROR"; switch (direction) { case MotorControllerCom.Direction.Forward: dir_string = "FORWARD"; break; case MotorControllerCom.Direction.Reverse: dir_string = "REVERSE"; break; case MotorControllerCom.Direction.NoDirection: dir_string = "NO DIRECTION"; break; } Action <MotorControllerCom.Direction> update_action = (d) => { UpdateDirection(d); }; Dispatcher.BeginInvoke(update_action, direction); } }); }