【问题标题】:For each loop doesn't sleep对于每个循环不睡觉
【发布时间】:2011-11-02 02:16:15
【问题描述】:

我有一个 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

问题是循环不休眠。我想触发动画,然后等到矩形填充改变,然后继续其余的,但似乎所有的矩形填充都同时改变了。那我做错了什么?

【问题讨论】:

  • 看起来你正在让主线程进入睡眠状态。这意味着动画可能在 thread.sleep 完成之前甚至不会开始。

标签: wpf vb.net


【解决方案1】:

您使 UI 线程休眠,因此循环和所有渲染都停止了。你可以试试像this one我写的另一个问题的方法。

编辑:同时更改 Michael Holdshteyn 指出的时间。

【讨论】:

  • 能否将答案中的代码转换为 VB.NET?
  • @Cobold:我不会说 VB.NET,但this converter tool 可能会帮助你。 (另外我想说的是,与 VB.NET 相比,C# 真的不难理解)
【解决方案2】:

替换:

System.Threading.Thread.Sleep(0.5)

与:

System.Threading.Thread.Sleep(500)

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

【讨论】:

  • 这不起作用,它只会为我拥有的每个矩形等待 0.5 秒,并且只有在它处理完所有矩形后才会改变它们的颜色。
【解决方案3】:

Thread.Sleep 以 MILLISECONDS 作为时间。所以你说你想让它休眠 0.5 毫秒(或 0.00005 秒)。

这可能不足以完成任务。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-17
    • 1970-01-01
    • 1970-01-01
    • 2013-11-22
    • 2020-05-11
    • 1970-01-01
    • 1970-01-01
    • 2015-04-19
    相关资源
    最近更新 更多