首页 > 解决方案 > 睡眠与。延迟与计时器。如何选择最佳选项

问题描述

我知道这是一个普遍的问题。但是即使在浏览了不同的文章之后,它仍然令人困惑。我有一个 Windows 窗体应用程序。我通过 PC 的串行端口从设备读取了一些数据。为了正确传输数据,我的应用程序有时不得不频繁等待。(以确保没有数据丢失)。我尝试Thread.Sleep()并意识到我的设备多次丢失串行连接。我已经看到了 aTimer是一个选项的解释,但是a 是否也Timer冻结了 UI?在这种情况下,哪个是最佳选择(SleepTask.DelayTimer)?

private static System.Timers.Timer _delayTimer;
private static void delay(int Time_delay)
 {
   int i = 0;          
   _delayTimer = new System.Timers.Timer();
   _delayTimer.Interval = Time_delay;
   _delayTimer.AutoReset = false; 
   _delayTimer.Elapsed += (s, args) => i = 1;
   _delayTimer.Start();
   while (i == 0) { };
}
private async void delayAsync(int delaySec)
{            
    await Task.Delay(vals);   //is it the right way of doing delay ?           
}

标签: c#multithreading

解决方案


Thread.Sleep挂起当前线程。在 UI 线程上调用它会使 UI 无响应 - 因为您在给定时间内暂停当前线程。

您可以Task.Delay与 with 一起使用await来执行逻辑块,而无需暂停 UI 线程。这样,您的应用程序保持响应,但仍等待延迟完成。


推荐阅读