如何在没有Thread.Sleep()的情况下让我的项目睡眠?

时间:2016-05-17 12:38:39

标签: c# wpf gmap.net

我有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控件。 有没有解决方案?

2 个答案:

答案 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中触发代码。