I didn't test this code but you have to check if the form itself requires an invoke. Invoke method assures that background thread is synchronized with the main thread. Plus I don't suggest you to use Thread.Sleep.
public void AnimateAction(Actions Action, int PositionX, int PositionY)
{
Thread AnimationThread = null;
AnimationThread = new Thread(new ThreadStart(() => AnimateAction(Action, PositionX, PositionY, 1500)));
AnimationThread.Start();
}
private void AnimateAction(Actions Action, int PositionX, int PositionY, int AnimationDuration)
{
if (form.Controls.InvokeRequired)
{
form.Controls.Invoke(new Action(AnimateAction), Action, PositionX, PositionY);
}
else
{
Control ActionAnimation = UiHandler.GetInstance().CreateActionItem(Action, PositionX, PositionY);
form.Controls.Add(ActionAnimation);
ActionAnimation.BringToFront();
form.Controls.Remove(ActionAnimation);
}
}