我希望我的方法等待大约500毫秒,然后检查某个标志是否已更改。如何在不阻塞我的应用程序的情况下完成这个任务?
我希望我的方法等待大约500毫秒,然后检查某个标志是否已更改。如何在不阻塞我的应用程序的情况下完成这个任务?
您可以使用await Task.Delay(500);
而无需像Sleep
一样阻塞线程,并且比定时器需要的代码要少得多。
Thread.Sleep(500)
会强制当前线程等待500毫秒。它可以工作,但如果整个应用程序在一个线程上运行,这不是你想要的。
在这种情况下,你需要使用一个Timer
,如下所示:
using System.Timers;
void Main()
{
Timer t = new Timer();
t.Interval = 500; // In milliseconds
t.AutoReset = false; // Stops it from repeating
t.Elapsed += new ElapsedEventHandler(TimerElapsed);
t.Start();
}
void TimerElapsed(object sender, ElapsedEventArgs e)
{
Console.WriteLine("Hello, world!");
}
AutoReset
设为true(或者根本不设置)以使计时器重复运行。DispatcherTimer
)。 - svick如果所讨论的方法在不同于应用程序其他部分的线程上执行,则执行以下操作:
Thread.Sleep(500);
System.Threading.Thread.Sleep(500);
更新
这不会阻塞您的应用程序,只会阻塞运行您方法的线程。
异步任务:
var task = new Task (() => function_test()); task.Start();
public void function_test() { `Wait for 5000 miliseconds` Task.Delay(5000);` }
使用计时器应该可以解决问题
如果需要使用线程,这里有一个示例
void Main()
{
System.Threading.Thread check= new System.Threading.Thread(CheckMethod);
check.Start();
}
private void CheckMethod()
{
//Code
Thread.Sleep(500);
}
最近我遇到了同样的问题,需要在不阻塞用户界面的情况下按计划运行一个操作。
这是我的解决方案:
private void Button_Click(object sender, RoutedEventArgs e)
{
RunOnSchedule(interval, cancellationToken);
}
private void RunOnSchedule(int interval, CancellationToken cancellationToken)
{
// Start the task you want to run on schedule
TaskToRunOnSchedule(args);
Task.Run(async () =>
{
// This loop checks if the task was requested to be cancelled every 1000 ms
for (int x = 0; x < interval; x+=1000)
{
if (cancellationToken.IsCancellationRequested)
{
break;
}
await Task.Delay(1000);
}
}).GetAwaiter().OnCompleted(() =>
{
// Once the task for delaying is completed, check once more if cancellation is requested, as you will reach this point regardless of if it was cancelled or not.
if (!cancellationToken.IsCancellationRequested)
{
// Run this method again
RunOnSchedule(interval, cancellationToken);
}
});
}
private void Wait (double milliseconds)
{
DateTime next = System.DateTime.Now.AddMilliseconds(milliseconds);
while (next > System.DateTime.Now)
Application.DoEvents();
}