Visual C#中断For循环

时间:2013-12-24 09:19:41

标签: c#

我是Visual C#的新手。 我正在创建一个程序,其中有一个图片框列表。我有一个for循环,根据图片框中的图像播放.wav文件。我正在使用PlaySync方法,因此对于循环中的每个i,播放.wav文件(对应于不同的图片框)直到结束,然后i增加然后播放不同的音符。
对于每个音符(基本上每个循环的i),我想改变正在播放.wav文件的图片框的背景颜色。
除非我在循环中添加消息框,否则代码运行时不会对图片框着色。我很确定我需要在循环中使用一个中断程序,以便让程序有机会为彩色图像着色。我已经尝试使用延迟(Thread.Sleep())来打破程序,但它不起作用。 我需要中断循环吗?如果是的话,会有什么用? 这是我的代码: * arrindex是一个整数,表示要播放的音符数 * pboxlist =图片框列表 * tempind =图片框列表的索引

    for (int i = 0; i <= arrindex; i++)
            {               
                if (tempind < pboxlist.Count()) //coloring the pictureboxes
                {
                    if (tempind != -1)
                    {
                        pboxlist[tempind].BackColor = Color.Transparent; //coloring the previous picturebox back to transparent

                    }
                    tempind++;
                    pboxlist[tempind].BackColor = Color.LightPink;

                }


                    regwav[row, col].PlaySync(); // a matrix where the .wav files are stored (row and col are integers that determine which .wav file to play)


        }

2 个答案:

答案 0 :(得分:0)

您可以使用Refresh()方法强制PictureBox es立即刷新。但是,它不会使您的应用程序响应,只要循环运行,您的表单就不会响应任何用户交互。

另一个选项是Application.DoEvents(),它使应用程序响应每个wave文件之间的用户交互,但它会导致比从中获得更多的麻烦(如果你可能最终在第一个循环中运行相同的循环“不小心)。

最后一个,但在大多数情况下花费时间,最好的方法是使用循环运行的单独线程。但问题是控件的属性(如PictureBox.BackColor)只能在创建表单的线程中设置。

正如Hans Passant在评论中提到的,你可以通过完全删除循环并使用计时器来解决你的问题,记住你自己的“当前i值”。一个表格领域。

有关使用单独线程并调用表单主题的示例,请参阅this link

答案 1 :(得分:0)

可能发生的是你在主线程上运行PlaySync,不允许它更新UI(即更改背景颜色)。

尝试将其作为异步播放