如何在项目中实现休眠而不使用Thread.Sleep()?

3

我有一个WPF项目,正在使用GMap.Net。我的项目是显示城市中公交车位置。为了演示版本,我想要一个点列表,并且每5秒钟更改标记的位置。但存在两个问题。首先,我应该提到,在演示版本时,我没有互联网连接;其次,当我尝试休眠时,地图在所有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控件。有什么解决办法吗?
2个回答

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

我尝试了Task.Delay(5000); 但所有的点都立即绘制出来了。这是怎么回事? - Meyssam Toluie
你使用了await/async关键字吗? - Nasreddine
谢谢,它有效,我会在7分钟内接受您的答案。 - Meyssam Toluie
使用 Task 处理逻辑,使用 SynchronizationContext 创建或更改 UI 对象。 - Lance
我有另一个问题。代码MainMap.Markers.RemoveAt(0);未能从MainMap中移除标记。为什么? - Meyssam Toluie
@MeysamTolouee 我不熟悉GMap.NET。如果您发布一个新问题,您会得到更好的答案。 - Nasreddine

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接