我发现了很多关于从另一个线程更新GUI的帖子,但是它向各个方向发展。我希望有人可以为我的申请解释更好的方式。
我有一个带有GMap.Net控件的表单来显示地图。我创建了一个线程,它将从数据库中收集Lat,Long位置,进行一些计算,并让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位上使用VS 2012和.Net 4.5。