【问题标题】:Visual C# Interrupting a For LoopVisual C# 中断 For 循环
【发布时间】:2025-12-14 09:35:02
【问题描述】:

我对 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)


        }

【问题讨论】:

  • 在 Windows 窗体中,您可以使用 Application.DoEvents 来更新 UI,但最好将此代码移动到工作线程。
  • GUI 编程中非常重要的编程细节,您的 UI 不会更新,直到您的程序再次空闲。不要使用 for() 循环,而是使用 Timer。

标签: c#


【解决方案1】:

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

另一个选项是Application.DoEvents(),它使应用程序响应每个波形文件之间的用户交互,但它带来的麻烦比你从中获得的更多(如果你是不小心)。

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

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

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

【讨论】:

    【解决方案2】:

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

    尝试异步播放

    【讨论】:

    • 谢谢,我试试看。