等待最多5秒钟

时间:2017-06-15 18:34:46

标签: c# .net-3.5

我正在尝试实现等待布尔值为true的东西。如果5秒后布尔值仍然不为真,那么我将执行错误消息代码

这就是我现在正在做的事情。但是这种方法只需要等待5秒钟,这就是浪费时间。我怎么能做这样的事情,一旦变量变为真,就会执行?

Thread.Sleep(5000);
if (imageDisplayed == true) {
    //success
}
else {
    //failed
}

5 个答案:

答案 0 :(得分:4)

最好为此使用ManualResetEvent

// Somewhere instantiate this as an accessible variable to both 
// display logic and waiting logic.
ManualResetEvent resetEvent = new ManualResetEvent(false);

// In your thread where you want to wait for max 5 secs
if(resetEvent.WaitOne(5000)) {   // this will wait for max 5 secs before continuing.
    // do your thing
} else {
    // run your else logic.
}

// in your thread where you set a boolean to true
public void DisplayImage() {
    // display image
    display();

    // Notify the threads waiting for this to happen
    resetEvent.Set();   // This will release the wait/lock above, even when waiting. 
}
经验法则。最好不要在生产代码中使用sleep,除非你有一个真正的,非常非常好的理由。

答案 1 :(得分:0)

将你的睡眠分解为小睡。" ;)

for (int n = 0; n < 50; n++)
{
    Thread.Sleep(100);
    if (imageDisplayed)
    {
        // success
        break;
    }
}
//failed

不是很直接,但延迟时间最长为100毫秒。

答案 2 :(得分:0)

您可以将超时变量设置为您希望停止等待的时间,并将其与您正在等待的检查一起用作while循环中的条件。在下面的示例中,我们只是在检查之间休眠十分之一秒,但您可以根据需要调整睡眠时间(或删除它):

var timeout = DateTime.Now.AddSeconds(5);

while (!imageDisplayed && DateTime.Now < timeout)
{
    Thread.Sleep(100);
}

// Here, either the imageDisplayed bool has been set to true, or we've waited 5 seconds

答案 3 :(得分:0)

使用while循环并逐步检查您的情况

var waitedSoFar = 0;
var imageDisplayed = CheckIfImageIsDisplayed(); //this function is where you check the condition

while(waitedSoFar < 5000)
{
   imageDisplayed = CheckIfImageIsDisplayed();
   if(imageDisplayed)
   {
      //success here
      break;
   }
   waitedSoFar += 100;
   Thread.Sleep(100);
}
if(!imageDisplayed)
{
    //failed, do something here about that.
}

答案 4 :(得分:-2)

听起来您想使用System.Timers.Timer课程。

设置布尔变量以在设置为true时执行函数

    System.Timers.Timer t;
    private bool val;
    public bool Val {
        get { return val; }
        set
        {
            if (value == true)
                // run function here
            val = value;
        }
    }

然后每隔5秒设置一次定时器间隔。

    public Main()
    {
        InitializeComponent();

        t = new System.Timers.Timer(5000);

        t.Elapsed += T_Elapsed;
    }

    private void T_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
        throw new Exception();
    }

要启动计时器,只需使用t.Start()t.Reset()重置计时器