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

How Make my project sleep without Thread.Sleep()?

我有 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循环后,地图就会显示出来。 我试试:

Task.Factory();

 BackgroundWorker

但我得到了错误,因为我的代码包含 UI 控件。 有什么解决办法吗?

您可以使用 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);
}

如果您要使用睡眠,则需要在后台线程中。如果您 运行 是主 UI 线程上的一个方法并且您睡眠,则 UI 将睡眠。查看 BackgroundWorker class。 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 中触发您的代码。