"El hilo que llama debe ser STA" solución

Sé que hay algunas respuestas sobre este tema en SO, pero no consigo que ninguna de las soluciones funcione para mí. Estoy intentando abrir una nueva ventana, desde un ICommand disparado desde una placa de datos. Ambos de los siguientes dan el error mencionado anteriormente.cuando se crea una instancia de la nueva ventana (dentro de "new MessageWindowP"):

Usando TPL / FromCurrentSynchronizationContext Actualización: funciona

<code>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();
    }
}
</code>

Utilizando ThreadStart: Actualización: no recomendado, ver la respuesta de Jon

<code>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();
    }
}
</code>

Gracias

EDITAR. En base a las respuestas hasta el momento, me gustaría señalar que también probé BeginInvoke en el despachador actual, además de ejecutar el código en el método original (así es como comenzó el código). Vea abajo:

Comenzarinvocarse Actualización: no se recomienda ver la respuesta de Jon.

<code>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();
    }
}
</code>

En el mismo hilo Actualización: funciona si ya estás en el hilo de la interfaz de usuario

<code>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();    
        }
    }

}
</code>

BeginInvoke, usando la referencia al despachador de la primera / ventana principal Actualización: funciona

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

donde GeneralManager.MainDispatcher es una referencia al Dispatcher de la primera ventana que creo:

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

Estoy en una pérdida.

Respuestas a la pregunta(3)

Su respuesta a la pregunta