因为每个循环都不会睡觉

时间:2011-11-01 18:09:00

标签: wpf vb.net

我有一个For..Each循环,循环遍历所有网格的矩形并随机更改它们的填充。我用彩色动画更改了填充。这是我的代码:

        Dim rand as new random
        Dim changeColor As New Animation.ColorAnimation

        changeColor.Duration = TimeSpan.FromSeconds(0.5)

        For Each r As Rectangle In Grid.Children
            changeColor.From = ColorConverter.ConvertFromString(r.Fill.ToString)            
            Dim i As Integer = rand.Next(0, 2)
            Select Case i
                Case 0
                    changeColor.To = Colors.White
                Case 1
                    changeColor.To = Colors.Gray
            End Select
            Animation.Storyboard.SetTarget(changeColor, r)
            Animation.Storyboard.SetTargetProperty(changeColor, New PropertyPath("Fill.Color"))
            Dim sb As New Animation.Storyboard
            sb.Children.Add(changeColor)

            sb.Begin()
            System.Threading.Thread.Sleep(0.5)
        Next

问题是循环没有睡眠。我想触发动画,然后等到矩形填充更改然后继续其余部分,但似乎所有矩形填充都在同一时间更改。那么我做错了什么?

3 个答案:

答案 0 :(得分:2)

您睡眠UI线程,因此循环和所有渲染都会暂停。您可以尝试使用我为其他问题撰写的this one方法。

编辑:也改变Michael Holdshteyn指出的时间。

答案 1 :(得分:0)

替换:

System.Threading.Thread.Sleep(0.5)

使用:

System.Threading.Thread.Sleep(500)

睡眠值是一个整数is in Milliseconds。当您执行Sleep(0.5)时,您所获得的只是一个上下文切换。

答案 2 :(得分:0)

Thread.Sleep将MILLISECONDS视为时间。所以你说你希望它睡眠0.5毫秒(或0.00005秒)。

可能或不足以完成任务。

然后,您也可能在与UI相同的线程中运行。如果是这种情况,那么除非您使视觉无效,否则在完成处理之前屏幕不会刷新。