我有布尔变量。我有基于此布尔值的计时器。两者都有不同的形式。表单初始化时,Boolean为True。它在特定条件下设置为false。我想在设置为false之前保持2-3秒。
//Form 1
Private void updateGrid()
{
if(Form2.isBooleanTrue)
{
//Code to execurte
}
}
//Form 2
public static isBooleanTrue = false;
Private void checkCondition()
{
// I want to hold here. Note it should not hold the Form1 process
isBooleanTrue = true;
}
任何正文都可以建议我如何在布尔值设置为false之前保持进程?所以,计时器可以运行几秒钟。
答案 0 :(得分:2)
您可以使用Thread.Sleep
,它会在给定的时间段内暂停当前线程。
Thread.Sleep(3000); // 3 sec wait.
<强>更新强>
要让UI响应并在几秒钟后获得更新,您可以在下面执行此操作。
this.Invoke((MethodInvoker)delegate {
Thread.Sleep(3000);
// run your code on UI thread
});
另一个选项是,启动执行操作的 asynchoronous Task
。
Task.Factory.StartNew(()=>
{
Thread.Sleep(3000); // wait 3 secs
form1.Invoke(new Action(()=>
{
// your logic goes here.
}));
});
答案 1 :(得分:1)
如果您使用C#5或更高版本运行.NET 4.5或更高版本,则可以使用async / await功能。
将您的方法标记为async
并且(如果可能,不必要但建议)将其返回类型更改为Task
。然后,您可以使用Task.Delay
使您的UI线程等待您想要的任何时间。
重要的是它将等待异步,因此它不会冻结您的UI,不像您使用Thread.Sleep
,而是它将从您的方法返回并继续执行其他代码。 3秒后,它会将该方法的其余部分作为任务延续运行,这将更新您的isBooleanTrue
字段。
您的方法现在应如下所示:
private async Task checkCondition() // If you can't change the return type you can leave it as void, although it's not recommended.
{
await Task.Delay(3000);
isBooleanTrue = true;
}
请注意,即使返回类型为Task
,该方法也不会返回任何内容。这是新的async / await语法的一个特性,将自动生成返回的Task
。
您可以详细了解here。