我有WPF项目。我正在使用GMap.Net。 我的项目即将展示城市上方的公交车位置。对于演示版本,我想要有点列表并每5秒更改一次标记位置。 有2个问题。首先,我应该提一下,在演示演示版本时我没有互联网连接,第二个是当我尝试睡眠时,在所有Thread.Sleeps()执行之前没有显示任何内容。
PointLatLng[] points = new PointLatLng[]
{
new PointLatLng(34.633400, 50.867886),
new PointLatLng(34.632469, 50.866215),
new PointLatLng(34.631213, 50.864210),
new PointLatLng(34.629314, 50.861153),
new PointLatLng(34.626737, 50.857140)
};
int i = -1;
do
{
i++;
GMapMarker marker = new GMapMarker(points[i]);
marker.Shape = new Control.Marker(0, 0, 65, 90);
MainMap.Markers.Add(marker);
System.Threading.Thread.Sleep(5000);
MainMap.Markers.RemoveAt(0);
if (i == 3) break; ;
} while (true);
执行Do-While循环后,Map将显示。 我试试:
Task.Factory();
和
BackgroundWorker
但我得到了错误,因为我的代码包含UI控件。 有没有解决方案?
答案 0 :(得分:3)
您可以使用await Task.Delay(5000);
代替Thread.Sleep(5000);
。请注意,您的方法应标记为async
。这是一个例子:
public async Task MyMethod(){
// ^^^^^ async keyword here
PointLatLng[] points = new PointLatLng[]
{
new PointLatLng(34.633400, 50.867886),
new PointLatLng(34.632469, 50.866215),
new PointLatLng(34.631213, 50.864210),
new PointLatLng(34.629314, 50.861153),
new PointLatLng(34.626737, 50.857140)
};
int i = -1;
do
{
i++;
GMapMarker marker = new GMapMarker(points[i]);
marker.Shape = new Control.Marker(0, 0, 65, 90);
MainMap.Markers.Add(marker);
await Task.Delay(5000);
//^^^ await keyword here
MainMap.Markers.RemoveAt(0);
if (i == 3) break;
} while (true);
}
答案 1 :(得分:0)
如果您要使用sleep,则需要在后台线程中。如果您正在主UI线程上运行方法并且您正在睡眠,则UI将处于休眠状态。查看BackgroundWorker类。 https://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker(v=vs.110).aspx
可能更好的选择是使用DispatchTimer并将间隔设置为5秒,在计时器方法https://msdn.microsoft.com/en-us/library/system.windows.threading.dispatchertimer(v=vs.110).aspx中触发代码。