在单独的 STA 线程添加许多控件时刷新用户界面

Refresh the user interface while a separated STA thread is adding many controls

我想通过线程在我的地图上添加图钉。线程是 STA,我使用调度程序。

问题是我的地图没有用图钉刷新。地图上未显示图钉。

我有一个名为 "SerialInterf" 的 class,它读取串行端口。每次阅读都会调用事件 'DataReceivedHandler':

private void DataReceivedHandler(Object sender, SerialDataReceivedEventArgs e)
    {
        SerialPort port = (SerialPort)sender;
        string data = port.ReadExisting();

        LatLong message = GetData(data);

        SerialInterfEventArgs arg = new SerialInterfEventArgs(message);
        this.MessageReceived(this, arg);
    }

事件 "DataReceivedHandler" 调用了同一 class 的另一个名为 "MessageReceived" 的事件。 class SerialInterf 由我的 MainWindow class 实例化。在最后一个中,定义了事件 "MessageReceived":

transm.MessageReceived += new Trans.SerialInterfEventHandler(WriteTrace);

方法 WriteTrace 启动线程 (STA):

private void WriteTrace(object sender, TransmissionEventArgs e)
        {
            // On crée un thread car on ne peut pas modifier l'utilisateur interface avec un thread MTA (par défaut).
            Thread thread = new Thread(() => test(e.Message));
            thread.SetApartmentState(ApartmentState.STA);
            thread.Start();
        }

此线程启动方法 "test",它必须在我的地图上创建我的图钉:

private void test(LatLong message)
        {
            this.Dispatcher.Invoke(new Action(() => 
            {
                Pushpin pin = new Pushpin();
                pin.Location = new Location(message.Latitude, message.Longitude);

                map.Children.Add(pin);
            }));
        }

代码

this.Dispatcher.Invoke(new Action(() => 

已被

修改
this.map.Dispatcher.Invoke(new Action(() => 

现在可以了!

参见:Cross-thread

我认为我不需要 STA 线程。