最多等待 5 秒
Wait for maximum 5 seconds
我正在尝试实现一些等待布尔值变为真的东西。如果 5 秒后布尔值仍然不正确,那么我将执行错误消息代码
这就是我现在正在做的事情。但是这种方法对所有情况都只等待 5 秒,这是在浪费时间。我怎样才能做这样的事情,一旦变量变为真就执行?
Thread.Sleep(5000);
if (imageDisplayed == true) {
//success
}
else {
//failed
}
把你的睡眠分成 "naps." ;)
for (int n = 0; n < 50; n++)
{
Thread.Sleep(100);
if (imageDisplayed)
{
// success
break;
}
}
//failed
不是很快,但有最大 100 毫秒的延迟。
您可以将超时变量设置为您想要停止等待的时间,并将其与您正在等待的检查一起用作 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
使用 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.
}
最好为此使用 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.
}
经验法则。最好不要在您的生产代码中使用休眠,除非您有非常、非常、非常好的理由这样做。
听起来您想使用 System.Timers.Timer class。
设置您的布尔变量以在它设置为 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()
重置定时器
我正在尝试实现一些等待布尔值变为真的东西。如果 5 秒后布尔值仍然不正确,那么我将执行错误消息代码
这就是我现在正在做的事情。但是这种方法对所有情况都只等待 5 秒,这是在浪费时间。我怎样才能做这样的事情,一旦变量变为真就执行?
Thread.Sleep(5000);
if (imageDisplayed == true) {
//success
}
else {
//failed
}
把你的睡眠分成 "naps." ;)
for (int n = 0; n < 50; n++)
{
Thread.Sleep(100);
if (imageDisplayed)
{
// success
break;
}
}
//failed
不是很快,但有最大 100 毫秒的延迟。
您可以将超时变量设置为您想要停止等待的时间,并将其与您正在等待的检查一起用作 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
使用 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.
}
最好为此使用 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.
}
经验法则。最好不要在您的生产代码中使用休眠,除非您有非常、非常、非常好的理由这样做。
听起来您想使用 System.Timers.Timer class。
设置您的布尔变量以在它设置为 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()
重置定时器