我有一个GPS类,我明显用于获取纬度和经度。帮我解决这个与GPS的线程问题
当gps状态或位置发生更改时,会调用UpdateData()。所以我确保Latitude和Longitude都是有效的,然后让DataReady布尔值等于true。所以我使用这个代码在一个相当n00b时尚,我使用一个计时器(Windows窗体的一个),并检查getGPSCoordinates()每10秒查看是否有有效的位置(getGPSCoordinates()不为空),如果不,请执行其余的代码。这是使用,因为它可能需要10秒,甚至1分钟才能获得清晰的GPS信号。
所以,虽然这工作正常,我知道这不是正确的方式来做到这一点。我认为整个GPS业务应该在一个单独的线程上进行,并且它应该通知主线程位置已更改且数据已准备就绪。
有人能指出我处理这类业务的正确方法吗?我应该使用IAsyncResult
来通知主线程吗?
bool DataReady = false;
private void UpdateData()
{
if (gps.Opened)
{
if (position != null)
{
if (position.LatitudeValid)
{
Latitude = position.Latitude.ToString();
}
if (position.LongitudeValid)
{
Longitude = position.Longitude.ToString();
}
if (Latitude != null && Longitude != null)
DataReady = true;
}
}
public string getGPSCoordinates()
{
if (DataReady)
{
return String.Format("http://maps.google.com/maps/api/staticmap?sensor=false&size=500x500&markers=color:red|label:A|{0},{1}&zoom=15&maptype=hybrid", Latitude, Longitude);
}
else
return null;
}
}
在这个MSDN条目中实际上有一个非常类似的想法: http://msdn.microsoft.com/en-us/library/dd990377.aspx – 2010-07-23 08:37:09
不幸的是,这是在.NET Framework 4中支持的。我的目标是.NET Compact Framework 3.5 – 2010-07-23 08:44:00
当然,没有发现。然而,要将某些东西重新封装到特定的线程中,则需要轮询队列或其他东西(请考虑WinForms中的Message Pump)。如果你要回到用户界面,这将是可能的。 – 2010-07-23 08:49:22