Pregunta WPF System.InvalidOperationException: el hilo de llamada no puede acceder a este objeto porque lo posee un hilo diferente


En mi Windows tengo un TextBox que me gusta actualizar (propiedad del texto) de otro hilo. Al hacerlo, obtengo la excepción InvalidOperationException (ver título). He encontrado diferentes enlaces en google explicando esto, pero todavía no puedo hacer que funcione.

Lo que he intentado es esto:

Código Window1:

private static Window1 _myWindow;
private MessageQueueTemplate _messageQueueTemplate;
private const string LocalTemplateName = "LocalExamSessionAccessCodeMessageQueueTemplate";
private const string RemoteTemplateName = "RemoteExamSessionAccessCodeMessageQueueTemplate";

...
public Window1()
{
    InitializeComponent();
    _myWindow = this;
}

public static Window1 MyWindow
{
    get
    {
        return _myWindow;
    }
}

public void LogText(string text)
{
    informationTextBox.Text += text + Environment.NewLine;
}
...

En otra clase (en realidad, un adaptador de escucha Spring.NET, escuchando cierta cola, comenzó en otro hilo).

var thread = new Thread(
    new ThreadStart(
        delegate()
            {
                Window1.MyWindow.Dispatcher.Invoke(
                    System.Windows.Threading.DispatcherPriority.Normal,
                    new Action(
                        delegate()
                            {
                                Window1.MyWindow.LogText(text);
                            }
                        ));
            }
        ));

No arroja un error, pero el texto en el método LogText en Window1 no se desencadena, por lo que el texto no se actualiza.

Entonces, básicamente, quiero actualizar este componente TextBox de otra clase que se ejecuta en otro hilo.


5
2017-08-16 09:18


origen


Respuestas:


Window1.MyWindow.informationTextBox.Dispatcher.Invoke(
    DispatcherPriority.Normal,
    new Action(() => Window1.MyWindow.informationTextBox.Text += value));

6
2017-08-16 11:17



Bueno, usando Dispatcher.Invoke o BeginInvoke Definitivamente es el camino a seguir, pero en realidad no has mostrado mucho código además de crear un hilo, por ejemplo, no lo has hecho. empezado el hilo en tu segundo bloque de código.

Si pones el Dispatcher.Invoke Código en el lugar donde anteriormente estaba recibiendo una InvalidOperationException, debería estar bien.


3
2017-08-16 09:20



Para WPF, encuentro este constructo:

 BackgroundWorker bw = new BackgroundWorker();
  bw.DoWork += ( s, e ) =>
  {
  };
  bw.RunWorkerCompleted += ( s, e ) =>
  {
  };
  bw.RunWorkerAsync();

Para ser el más útil. El bloque RunWorkerCompleted normalmente actualizará un ObservableCollection o lanzará un RaisePropertyChangedEvent.


0
2017-08-16 09:56