internal void HandleLongPress(TouchEffect sender) { if (sender.State == TouchState.Normal) { longPressTokenSource?.Cancel(); longPressTokenSource?.Dispose(); longPressTokenSource = null; return; } if (sender.LongPressCommand == null || sender.InteractionStatus == TouchInteractionStatus.Completed) { return; } longPressTokenSource = new CancellationTokenSource(); Task.Delay(sender.LongPressDuration, longPressTokenSource.Token).ContinueWith(t => { if (t.IsFaulted && t.Exception != null) { throw t.Exception; } if (t.IsCanceled) { return; } var longPressAction = new Action(() => { sender.HandleUserInteraction(TouchInteractionStatus.Completed); sender.RaiseLongPressCompleted(); }); if (Device.IsInvokeRequired) { Device.BeginInvokeOnMainThread(longPressAction); } else { longPressAction.Invoke(); } }); }