【问题标题】:How Make my project sleep without Thread.Sleep()?如何让我的项目在没有 Thread.Sleep() 的情况下休眠?
【发布时间】:2016-05-17 12:38:39
【问题描述】:

我有 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 控件。 有什么解决办法吗?

【问题讨论】:

    标签: c# wpf gmap.net


    【解决方案1】:

    您可以使用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);但所有点立即绘制。它是如何工作的?
    • 你使用了 await/async 关键字吗?
    • 谢谢它的工作,我会在 7 分钟内接受你的回答。
    • Task 用于逻辑,SynchronizationContext 用于创建或更改 UI 对象
    • 我还有一个问题。代码 MainMap.Markers.RemoveAt(0);不会从 MainMap 中删除标记。为什么?
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-30
      • 2012-03-15
      • 1970-01-01
      • 2016-05-19
      • 2015-10-19
      • 1970-01-01
      相关资源
      最近更新 更多