我想在两条指令之间等待几秒钟,但没有阻止执行.
例如,Thread.Sleep(2000)它不好,因为它会阻止执行.
我的想法是,我调用一个方法,然后等待X秒(例如20)监听一个事件.在20秒结束时,我应该根据20秒内发生的事情进行一些操作.
小智 84
我认为你所追求的是Task.Delay.这不会像Sleep那样阻塞线程,这意味着您可以使用异步编程模型使用单个线程来执行此操作.
async Task PutTaskDelay()
{
await Task.Delay(5000);
}
private async void btnTaskDelay_Click(object sender, EventArgs e)
{
await PutTaskDelay();
MessageBox.Show("I am back");
}
Run Code Online (Sandbox Code Playgroud)
Oma*_*mar 25
我用:
private void WaitNSeconds(int segundos)
{
if (segundos < 1) return;
DateTime _desired = DateTime.Now.AddSeconds(segundos);
while (DateTime.Now < _desired) {
System.Windows.Forms.Application.DoEvents();
}
}
Run Code Online (Sandbox Code Playgroud)
Mat*_*att 12
这是使用另一个线程的好例子:
// Call some method
this.Method();
Task.Factory.StartNew(() =>
{
Thread.Sleep(20000);
// Do things here.
// NOTE: You may need to invoke this to your main thread depending on what you're doing
});
Run Code Online (Sandbox Code Playgroud)
上面的代码需要.NET 4.0或更高版本,否则请尝试:
ThreadPool.QueueUserWorkItem(new WaitCallback(delegate
{
Thread.Sleep(20000);
// Do things here
}));
Run Code Online (Sandbox Code Playgroud)
Nic*_*ter 11
如果您无法将环境升级到.NET 4.5以获得对异步和等待API的访问权限,那么Omar的解决方案是不错的.也就是说,为了避免表现不佳,应该进行一项重要的改变.在调用Application.DoEvents()之间应该稍加延迟,以防止过多的CPU使用.通过增加
Thread.Sleep(1);
Run Code Online (Sandbox Code Playgroud)
在调用Application.DoEvents()之前,您可以添加这样的延迟(1毫秒)并阻止应用程序使用它可用的所有cpu周期.
private void WaitNSeconds(int seconds)
{
if (seconds < 1) return;
DateTime _desired = DateTime.Now.AddSeconds(seconds);
while (DateTime.Now < _desired) {
Thread.Sleep(1);
System.Windows.Forms.Application.DoEvents();
}
}
Run Code Online (Sandbox Code Playgroud)
*有关使用Application.DoEvents()的潜在缺陷的更详细讨论,请参阅https://blog.codinghorror.com/is-doevents-evil/.
| 归档时间: |
|
| 查看次数: |
90705 次 |
| 最近记录: |