我正在使用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
这导致事情发生在我希望它们发生之前,即用户在动画完成它们降落到所述空间之前已经收到有关其降落的空间的信息。
感谢您的帮助:)
答案 0 :(得分:1)
基本上,从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事件),但这样做的方式不会导致接口冻结。