2016-05-17 32 views
3

我有WPF项目。我正在与GMap.Net合作。 我的项目即将展示巴士在城市中的位置。对于演示版本,我想要列出点并每5秒更改一次标记位置。 有2个问题。首先,我应该提到,在展示演示版本时我没有互联网连接,第二个是当我尝试休眠时,映射在所有Thread.Sleeps()执行之前不显示任何内容。如何使我的项目没有Thread.Sleep()?

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控件我得到了错误。 有没有解决方法?

回答

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); 
} 
+0

我试过Task.Delay(5000);但所有的点都立即画出来。怎么运行的? –

+0

你使用了await/async关键字吗? – Nasreddine

+0

感谢它的工作,我会在7分钟内接受你的回答。 –

0

如果你打算使用睡眠,它将需要在后台线程。如果你正在主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中触发代码。

相关问题