等待一段时间而不阻塞主线程

san*_*art 21 c# multithreading wait

我希望我的方法等待大约500毫秒,然后检查是否有一些标志已经改变.如何在不阻止我的其他应用程序的情况下完成此操作?

小智 30

Thread.Sleep(500)将强制当前线程等待500ms.它可以工作,但如果您的整个应用程序在一个线程上运行,那么它不是您想要的.

在这种情况下,你会想要使用a 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!");
}
Run Code Online (Sandbox Code Playgroud)

AutoReset如果您希望计时器重复,您可以设置为true(或根本不设置).

  • 只是略微修正,`Interval`property的值为**毫秒**,而不是秒[link](http://msdn.microsoft.com/en-us/library/system.timers.timer.interval( v = vs.110)的.aspx) (3认同)
  • 我认为你可以向后使用AutoReset.将其设置为true或根本不设置它会使计时器重复.[链接](https://msdn.microsoft.com/en-us/library/system.timers.timer.autoreset%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396) (2认同)

Mar*_*skI 13

您可以在await Task.Delay(500);不阻塞线程的情况下使用Sleep,并且使用比Timer更少的代码.


Tud*_*dor 7

我真的不明白这个问题.

如果要在检查前阻止,请使用 Thread.Sleep(500);

如果要每x秒异步检查一次,则可以使用a Timer每隔x毫秒执行一次处理程序.

这不会阻止您当前的线程.


Phi*_*ein 5

有问题的方法是在与应用程序其余部分不同的线程上执行,然后执行以下操作:

Thread.Sleep(500);
Run Code Online (Sandbox Code Playgroud)