如何让我的项目在没有 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 中触发您的代码。
我有 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 中触发您的代码。