.net - 在计时器运行时停止执行
问题描述
我正在使用VB.net
. 我的问题是,当我运行计时器(用于精灵动画)时,我的程序的其余部分继续执行。有没有办法延迟程序的执行,直到定时器被禁用?
我尝试过使用Threading.thread.sleep()
,但这只会延迟整个过程。我认为这是因为计时器和启动它的函数都在同一个线程上运行?
While nextSpace <> endSpace
nextSpace += 1
timerMov.Start()
Threading.Thread.Sleep(timerMov.Interval * 100)
End While
Private Sub mov_Tick(sender As Object, e As EventArgs) Handles timerMov.Tick
curShip.img.Location = New Point(...)
If i = 100 Then
timerMov.Stop()
i = 0
End If
i += 1
End Sub
这会导致事情发生在我希望他们之前,即用户在动画完成之前收到关于他们已经登陆的空间的信息,他们已经登陆了所述空间。
谢谢你的帮助 :)
解决方案
基本上发生的事情是计时器从子例程内的 while 循环启动。我希望while循环等到计时器停止后再循环。
摆脱计时器并使用Async/Await。
这是它的样子,归结为它的本质:
Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
' ... possibly more code ...
While nextSpace <> endSpace
nextSpace += 1
For i As Integer = 0 To 100
Await Task.Delay(someDelayIntervalHere)
curShip.img.Location = New Point(...)
Next
End While
' ... possibly more code ...
End Sub
请注意,Sub 已Async
在其声明行中标记为 。在循环内部,该Await
行导致它暂停(替换 Timer 的 Tick 事件),但这样做不会导致界面冻结。
推荐阅读
- java - Spring Boot 1.5.20.RELEASE 上的 ErrorViewResolver 内无法重定向视图
- json - 如何将 json 内容写入 csv 文件?
- datatables - 如何将我的 BI 工具连接到 YouTube API (ODBC)?
- javascript - 我可以在客户端代码中更改 URL / 重定向的可能方法是什么?
- intellij-idea - Intellij Idea Refactoring - 如何让多个类扩展一个基类?
- python - 函数参数默认值的 Python 风格指南
- c - 如何编写ac程序来创建文件?
- javascript - Scrollmagic 不起作用 - 我该如何解决这个问题?
- javascript - 如何在反应中为直通点击事件添加颜色?(不改变字体颜色)
- cordova - 基于发布的代码推送的强制或可选更新