c# - 睡眠与。延迟与计时器。如何选择最佳选项
问题描述
我知道这是一个普遍的问题。但是即使在浏览了不同的文章之后,它仍然令人困惑。我有一个 Windows 窗体应用程序。我通过 PC 的串行端口从设备读取了一些数据。为了正确传输数据,我的应用程序有时不得不频繁等待。(以确保没有数据丢失)。我尝试Thread.Sleep()
并意识到我的设备多次丢失串行连接。我已经看到了 aTimer
是一个选项的解释,但是a 是否也Timer
冻结了 UI?在这种情况下,哪个是最佳选择(Sleep
或Task.Delay
或Timer
)?
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 ?
}
解决方案
Thread.Sleep
挂起当前线程。在 UI 线程上调用它会使 UI 无响应 - 因为您在给定时间内暂停当前线程。
您可以Task.Delay
与 with 一起使用await
来执行逻辑块,而无需暂停 UI 线程。这样,您的应用程序保持响应,但仍等待延迟完成。
推荐阅读
- google-apps-script - 请告诉我如何安全地在 GoogleAppScript 的属性中保存访问密钥和密钥
- html - 带有 svg 和 div 的讨厌的条带
- asp.net-core - Blazor 异常 - 当前线程未与 Dispatcher 关联。使用 InvokeAsync()
- javascript - 加载值时如何在extJS中更新网格存储数据中的值
- cuda - 我可以获得用作 __nv_nvrtc_builtin_header.h 的内容吗?
- java - 有没有办法只刷新 Spring MVC Controller 中的视图?
- javascript - 如何在另一个数组中对属性上的对象数组进行抓取?
- python - 基于python提取文本文件数据
- c# - C# - 如何使用 ref 结构作为泛型类型参数?
- javascript - 在本地运行posenet的问题