我在Windows移动应用程序中工作,我想用谷歌地图显示我当前的位置。我使用了样本中的Location dll。正如您在我的代码中看到的那样,我在 gps_Locationchanged 事件中调用了正确的方法来更新地图,其中我使用调用方法来更新pictureboxe的图像。问题是我无论何时何时都无法使用应用程序的主菜单和上下文菜单。这就像他们冻结,直到新地图完成下载。是否有另一种方法可以在不同的线程中执行此操作,以便可以随时使用它们?
void gps_LocationChanged(object sender, LocationChangedEventArgs args)
{
if (args.Position.LatitudeValid && args.Position.LongitudeValid)
{
pictureBox1.Invoke((UpdateMap)delegate()
{
center.Latitude = args.Position.Latitude;
center.Longitude = args.Position.Longitude;
LatLongToPixel(center);
image_request2(args.Position.Latitude, args.Position.Longitude);
});
}
}
答案 0 :(得分:3)
很难肯定地说,但看起来像(我假设)从服务器获取实际图像的image_request2()方法是个问题。如果您要在工作线程上运行此方法,并提供一个简单的回调方法,一旦完全下载后将在屏幕上绘制图像,这将使您的UI线程保持打开状态以接收来自用户的事件。
答案 1 :(得分:3)
也许是这些方面的东西?
bool m_fetching;
void gps_LocationChanged(object sender, LocationChangedEventArgs args)
{
if (m_fetching) return;
if (args.Position.LatitudeValid && args.Position.LongitudeValid)
{
ThreadPool.QueueUserWorkItem(UpdateProc, args);
}
}
private void UpdateProc(object state)
{
m_fetching = true;
LocationChangedEventArgs args = (LocationChangedEventArgs)state;
try
{
// do this async
var image = image_request2(args.Position.Latitude, args.Position.Longitude);
// now that we have the image, do a synchronous call in the UI
pictureBox1.Invoke((UpdateMap)delegate()
{
center.Latitude = args.Position.Latitude;
center.Longitude = args.Position.Longitude;
LatLongToPixel(center);
image;
});
}
finally
{
m_fetching = false;
}
}