“O segmento de chamada deve ser STA” solução alternativa

Eu sei que há algumas respostas sobre esse tópico no SO, mas não consigo que nenhuma das soluções funcione para mim. Eu estou tentando abrir uma nova janela, de um ICommand disparado de dentro de um datatemplate. Ambos os seguintes fornecem o erro mencionadoquando a nova janela é instanciada (dentro de "new MessageWindowP"):

Usando o TPL / FromCurrentSynchronizationContext Atualização: obras

public class ChatUserCommand : ICommand
{
    public void Execute(object sender)
    {
        if (sender is UserC)
        {
            var user = (UserC)sender;
            var scheduler = TaskScheduler.FromCurrentSynchronizationContext();                  
            Task.Factory.StartNew(new Action<object>(CreateMessageWindow), user,CancellationToken.None, TaskCreationOptions.None,scheduler);         
        }
    }

    private void CreateMessageWindow(object o)
    {
        var user = (UserC)o;
        var messageP = new MessageWindowP();
        messageP.ViewModel.Participants.Add(user);
        messageP.View.Show();
    }
}

Usando o ThreadStart: Atualização: não recomendado, veja a resposta de Jon

public class ChatUserCommand : ICommand
{
    public void Execute(object sender)
    {
        if (sender is UserC)
        {
            var user = (UserC)sender;

            var t = new ParameterizedThreadStart(CreateMessageWindow);
            var thread = new Thread(t);
            thread.SetApartmentState(ApartmentState.STA);
            thread.Start(sender);           
        }
    }

    private void CreateMessageWindow(object o)
    {
        var user = (UserC)o;
        var messageP = new MessageWindowP();
        messageP.ViewModel.Participants.Add(user);
        messageP.View.Show();
    }
}

obrigado

EDITAR. Com base nas respostas até agora, gostaria de salientar que eu também tentei BeginInvoke no despachante atual, bem como a execução do código no método original (que é como o código começou). Ver abaixo:

BeginInvoke Atualização: não recomendado, veja a resposta de Jon

public class ChatUserCommand : ICommand
{
    public void Execute(object sender)
    {
        if (sender is UserC)
        {
            var user = (UserC)sender;
            Dispatcher.CurrentDispatcher.BeginInvoke(new Action<object>(CreateMessageWindow), sender);       
        }
    }

    private void CreateMessageWindow(object o)
    {
        var user = (UserC)o;
        var messageP = new MessageWindowP();
        messageP.ViewModel.Participants.Add(user);
        messageP.View.Show();
    }
}

No mesmo segmento Atualização: funciona se você já estiver no thread da interface do usuário

public class ChatUserCommand : ICommand
{
    public void Execute(object sender)
    {
        if (sender is UserC)
        {
            var user = (UserC)sender;
            var messageP = new MessageWindowP();
            messageP.ViewModel.Participants.Add(user);
            messageP.View.Show();    
        }
    }

}

BeginInvoke, usando referência ao despachante da primeira / janela principal Atualização: obras

 public void Execute(object sender)
   {
       if (sender is UserC)
       {
            var user = (UserC)sender;
                    GeneralManager.MainDispatcher.BeginInvoke(
                               DispatcherPriority.Normal,
                               new Action(() => this.CreateMessageWindow(user)));      
        }
    }

onde GeneralManager.MainDispatcher é uma referência ao Dispatcher da primeira janela que eu crio:

     [somewhere far far away]
        mainP = new MainP();
        MainDispatcher = mainP.View.Dispatcher;

Estou em uma perda.