在单独的 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 线程。
我想通过线程在我的地图上添加图钉。线程是 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 线程。