c# (Windows IoT) - Sleep() or Delay()?
本文关键字:or Delay Sleep IoT Windows | 更新日期: 2023-09-27 18:15:11
如何在c#中为Windows IoT编写时间关键型后台应用程序?
目标是通过c#在Raspberry Pi 2上使用Windows IoT和Visual Studio 2015编程步进电机。编程通过远程调试工作良好,但没有睡眠或延迟可用。另外System.Threading.Thread.Sleep(time)是不可能的。
如果我们实现一个定时器,那么每一步之间的时间就不一样了。
就像5步快- 2步慢- 5步快- 2步慢- 5步快-等等....
我如何编程电机,他是正确的行为?
数据:
电机:HSY214 - F0.8 A NEMA8 -步进电机
Driver: A4988
我们在物联网设备项目中增加了c#对软件PWM和硬件PWM的支持。您还可以看到使用Windows IoT Core驱动步进电机的c++示例。如果有必要,你可以实现一个类似Thread的功能。使用System.Threading.Tasks.Task.Delay休眠。
可以这样:
Task.Delay(-1).Wait(100);
或
Task.Delay(100).Wait(-1);
或
Task.Delay(100).Wait();
在所有情况下结果都是相同的。
我做了一个简单的测试:
while (true)
{
pin26.Write(GpioPinValue.High);
Task.Delay(-1).Wait(100);
pin26.Write(GpioPinValue.Low);
Task.Delay(-1).Wait(100);
}
脉冲宽度的结果不太好-从98ms到116ms,更糟糕的结果是延迟时间短…100毫秒的延迟
10 ms的延时
将更好,如果您使用外部伺服驱动器的电机与步进方向接口。
您应该有一个将I/O状态与时间联系起来的法律,以及一个具有适当分辨率的时钟。然后,您有一个线程不断循环并使用时钟检查经过的时间。
我们可以使用ThreadPoolTimer
任务也可以称为线程,特别是当它们存在于任务中时。Windows中的一个标准线程对象是Timer....在Windows中,我们可以启动一个计时器线程,而不是使用延迟。一旦线程启动,我们就可以去做其他有用的事情,计时器会在周期到期时提醒我们。计时器通过timer Tick事件完成此操作。
看起来是这样的:
var t = Task.Run(async delegate
{
await Task.Delay(1000);
return 42;
});
t.Wait();
我习惯这样做:
Thread.Sleep(1000);
那么为什么c#物联网编码如此复杂?我也在树莓派上使用c++编程,看起来物联网的未来是Linux,如果MS-10 c#期望6行代码在线程中做固定延迟。