C# 睡眠Vs.延迟Vs.计时器。如何选择最佳方案

C# 睡眠Vs.延迟Vs.计时器。如何选择最佳方案,c#,multithreading,C#,Multithreading,我知道这是一个一般性的问题。但即使阅读了不同的文章,它仍然令人困惑。我有一个Windows窗体应用程序。我通过PC的串行端口从设备读取一些数据。为了正确传输数据,我的应用程序有时不得不频繁等待。(以确保没有数据丢失)。我尝试了Thread.Sleep(),发现我的设备多次失去串行连接。我看到过这样的解释:Timer是一个选项,但是Timer是否也冻结了UI?在这种情况下(Sleep或Task.Delay或Timer)哪一个是最好的选择 挂起当前线程。在UI线程上调用它会使UI无响应-因为您在给定

我知道这是一个一般性的问题。但即使阅读了不同的文章,它仍然令人困惑。我有一个Windows窗体应用程序。我通过PC的串行端口从设备读取一些数据。为了正确传输数据,我的应用程序有时不得不频繁等待。(以确保没有数据丢失)。我尝试了
Thread.Sleep()
,发现我的设备多次失去串行连接。我看到过这样的解释:
Timer
是一个选项,但是
Timer
是否也冻结了UI?在这种情况下(
Sleep
Task.Delay
Timer
)哪一个是最好的选择

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

您可以与一起使用来执行逻辑块,而无需挂起UI线程。这样,应用程序将保持响应,但仍会等待延迟完成。

在您的示例中:

专用静态无效延迟(整数时间延迟)
{
int i=0;
_delayTimer=新的System.Timers.Timer();
_delayTimer.Interval=时间\延迟;
_delayTimer.AutoReset=false;
_delayTimer.Appead+=(s,args)=>i=1;
_delayTimer.Start();
//该行等待计时器并冻结UI
而(i==0){};
}
服务员在UI线程中,冻结UI

我认为,你需要异步。 如果可以使用TPL(System.Threading.Task):


我不认为这两种等待技术都是导致串行端口连接丢失的原因。您可以指定在
断开连接技术问题
如何在c#桌面应用程序中睡眠/等待之间要解决的问题吗
?您使用什么UI框架?而不是询问线程阻塞
thread.sleep()
和任何异步
计时器类之间的区别(在功能上等同于
Task.Delay()
),您应该询问为什么串行端口上会丢失数据。这可能与代码中的延迟有关,也可能与代码中的延迟无关,即使是这样,增加更多的延迟可能是解决问题的正确方法,也可能不是。通常,现代PC在保持串行端口I/O速率方面没有问题,因此很可能您拥有更大的架构p有什么问题。
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 ?           
}

private static async void delay(TimeSpan timeDelay, Action updateUI)
{
   //Wait some time without freeze the UI
   await Task.Delay(timeDelay);
   //Call updateUI on UI's thread
   updateUI();
}