我从另一个线程中发现了很多关于 GUI 更新的帖子,但它是在各个方向上进行的。我希望有人可以为我的申请解释更好的方法。
我有一个带有 GMap.Net 控件的表单来显示地图。我创建了一个线程,它将从数据库中收集经纬度位置,进行一些计算并让 GUI 将这些位置显示为地图上的标记。
在 Form1.cs 中:
private void pictureBox1_Click(object sender, EventArgs e)
{
if (!_acquisitionClick)
{
_position.Start();
_acquisitionClick = true;
}
}
在 DevicePosition.cs 中:
public void Start()
{
_posThread = new Thread(new ThreadStart(StartPositionAcquisition));
_posThread.Start();
}
public void StartPositionAcquisition()
{
while(Thread.CurrentThread.IsAlive)
{
//Get positions from database and and do some computation
Thread.Sleep(2000);
}
}
现在我想根据线程更改的状态更新我的表单以指示新数据已到达。
什么是最好的方法:
1) Backgroundworker
我在_DoWork()
哪里获得位置并执行计算以及_RunWorkerCompleted()
我在哪里更新地图。在这里找到: http ://www.albahari.com/threading/part3.aspx#_BackgroundWorker
2):使用Thread
的Dispatcher.Invoke
方法直接更新地图。如果这是一个很好的解决方案,那么在这种情况下它是如何工作的?在这里找到: https ://stackoverflow.com/a/661662/4010683
3):使用Thread
类似的事件ProgressEvent
让主线程知道新数据已经到达并且应该继续更新地图......
4):我还错过了什么?
感谢您对此的帮助。顺便说一句,我在 Win 7 32 位上使用 .Net 4.5 的 VS 2012。