当我使用Thread.sleep()时,如何停止在C#中挂起应用程序

本文关键字:何停止 应用程序 挂起 Thread sleep | 更新日期: 2023-09-27 18:26:10

我在应用程序中使用Thread.sleep(),效果很好。但它会挂起我的整个用户界面,直到睡眠时间结束。当我不断刷新标签的任何文本时,也会发现这种挂起现象。

do
{
  lbl_waiting.Text = "Waiting for 20 seconds..";
  Thread.Sleep(1000 * 60);      //// 60 seconds waiting time
  string resultFromApi = SMS.OneToOneBulk(messageHeader, SMS_number_list);
} while(myCondition);

在这个等待时间里,我的完整用户界面挂起了。我需要在不中断前端或用户界面的情况下完成这个过程。

当我使用Thread.sleep()时,如何停止在C#中挂起应用程序

您可以采用异步方式,而使用Task.Delay()

async Task MyEventHandler()
{
    /// your code
    /// delay execution but don't block
    await Task.Delay(TimeSpan.FromSeconds(20));
}

Thread.Sleep的不同之处在于它不阻塞。

当您想要阻止当前线程时,可以使用Thread.Sleep

当您希望在不阻塞当前线程的情况下获得逻辑延迟时,可以使用Task.Delay

如果挂起UI是一个问题,那么您应该了解如何在ASP.NET应用程序中使用异步方法和异步/等待。一个很好的起点是这篇文章:

在ASP.NET 4.5中使用异步方法

您需要实现多线程来绕过这个问题,Thread.Sleep确实会停止整个应用程序。

如果这段代码在主应用程序线程中,那么它将停止UI以及其他一切。

如果您需要在发送文本消息之间等待,那么消息的发送需要在后台工作线程上完成,该线程可以在不阻塞UI 的情况下等待

如果您查看了这个dispatcherTimer类

您可以在特定的时间间隔内触发事件。

导入

using System.Windows.Threading

然后设置定时器线程

//  DispatcherTimer setup
DispatcherTimer dispatcherTimer = new DispatcherTimer();
dispatcherTimer.Tick += new EventHandler(dispatcherTimer_Tick);
dispatcherTimer.Interval = new TimeSpan(0,0,60); // set how often to try and run
dispatcherTimer.Start();

然后定义你认为适合的刻度函数

private void dispatcherTimer_Tick(object sender, EventArgs e)
{
    if (Conditions are met)
    {
        string resultFromApi = SMS.OneToOneBulk(messageHeader, SMS_number_list);
    }
}