当前位置: 首页 > 编程语言 > C#

如何异步等待x秒然后执行一些操作?分享

时间:2023-04-10 22:07:58 C#

如何异步等待x秒然后做某事?我知道在C#和Windows窗体中有Thread.Sleep和System.Windows.Forms.Timer和Monitor.Wait。我似乎无法弄清楚如何在不锁定线程的情况下等待X秒然后做其他事情。我有一个带有按钮的表格。单击按钮时,计时器应启动并等待5秒钟。在这5秒之后,窗体上的一些其他控件变为绿色。使用Thread.Sleep时,整个应用程序将无响应5秒-那么我如何“在5秒后做某事”?(转录为Ben的评论)只需使用System.Windows.Forms.Timer。将计时器设置为5秒,并处理Tick事件。当事件发生时,这样做。...并禁用计时器(IsEnabled=false)以在执行其他工作之前抑制秒数。Tick事件可能会在另一个无法修改您的gui的线程上执行,您可以捕获:privateSystem.Windows.Forms.TimermyTimer=newSystem.Windows.Forms.Timer();privatevoidStartAsyncTimedWork(){myTimer.Interval=5000;myTimer.Tick+=newEventHandler(myTimer_Tick);我的计时器开始();}privatevoidmyTimer_Tick(objectsender,EventArgse){if(this.InvokeRequired){/*不在UI线程上,重新进入那里...*/this.BeginInvoke(newEventHandler(myTimer_Tick),sender,e);}else{lock(myTimer){/*只有当我们已经在工作时这不是重新进入时才工作*/if(this.myTimer.Enabled){this.myTimer.Stop();this.doMyDelayedWork();这个.myTimer.Start();/*可选地重启以进行周期性工作*/}}}}只是为了完整性:使用async/await,你可以延迟做一些非常简单的事情(一次,不再调用):privateasyncTaskdelayedWork(){awaitTask.Delay(5000);this.doMyDelayedWork();}//这可以是按钮点击事件处理程序或类似的*/privatevoidStartAsyncTimedWork(){TaskignoredAwaitableResult=this.delayedWork();}有关详细信息,请参阅MSDN中的“asyncandawait”您可以启动执行操作的异步任务:Task.Factory.StartNew(()=>{Thread.Sleep(5000);form.Invoke(newAction(()=>DoSomething()));});[编辑]要传递间隔,只需将其存储在变量中:intinterval=5000;Task.Factory.StartNew(()=>{Thread.Sleep(interval);form.Invoke(newAction(()=>DoSomething()));});[/EDIT]你读错了。单击按钮后,它会以x秒为间隔启动计时器。当它们启动时,它的事件处理程序执行任务。好吧,你不想发生任何事情。虽然x秒过去了。?什么时候执行任务?例如,如果您不希望在延迟和任务完成之前单击按钮。在按钮单击处理程序中禁用它,并在任务完成时启用它。如果你想要的只是在任务之前有5秒的延迟,那么你应该将开始延迟传递给任务并让它处理它。您的应用挂起是因为您在主UI线程上调用了5秒的睡眠/等待。将睡眠/等待/什么操作放在单独的线程中(实际上System.Windows.Forms.Timer应该为您完成),完成后调用将某些控件变为绿色的操作。请记住检查InvokeRequired。这是一个简短的示例(SetText可以从另一个线程调用,如果是这样,它将在文本框所在的主UI线程上调用):privatevoidSetText(stringtext){//InvokeRequired需要比较//的线程ID调用线程到创建线程的线程ID。//如果这些线程不同,则返回true。如果(this.textBox1.InvokeRequired){SetTextCallbackd=newSetTextCallback(SetText);this.Invoke(d,newobject[]{text});}else{this.textBox1.Text=text;我从这里拿了样本(非常值得一读!)。@eFloh在标记为答案的帖子中说:Tick事件可能在另一个无法修改您的gui的线程上执行,您可以捕捉到这个……这不是文档所说的。您在示例代码中使用System.Windows.Forms.Timer。这是一个Forms.Timer。根据C#文档,Timer事件在UI线程上引发。此Windows计时器专为使用UI线程执行处理的单线程环境而设计。它要求用户代码有一个可用的UI消息泵,并且始终在同一线程中运行...另请参阅stackoverflowpost我认为您正在寻找的是System.Timers...我认为您不需要设置一个你想做什么CWND计时器:看看http://msdn.microsoft.com/en-us/library/0tcs6ww8(v=VS.90).aspx的例子。它应该可以解决问题。您是否尝试过publicstaticTaskDelay(intmillisecondsDelay)您可以这样使用:awaitTask.Deplay(5000);参考:https://msdn.microsoft.com/en-us/library/hh194873(v=vs.110).aspx以上是C#学习教程:如何异步等待x秒然后执行一些操作?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: