当我使用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);
在这个等待时间里,我的完整用户界面挂起了。我需要在不中断前端或用户界面的情况下完成这个过程。
您可以采用异步方式,而使用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);
}
}