当我使用Thread.Sleep时,如何更新UI

时间:2011-09-08 00:58:00

标签: c# wpf

这是我正在使用的功能:

    private void Convert2Morse(object obj)
    {
        TextConverted = am.Convert(NormalText);

        foreach (char symbol in TextConverted)
        {
            int milliseconds = 0;

            switch (symbol)
            {
                case '·': milliseconds = 500; break;
                case '—': milliseconds = 1000; break;
                case ' ': continue;
                default: throw new Exception("Something is wrong");
            }

            System.Media.SystemSounds.Beep.Play();
            System.Threading.Thread.Sleep(milliseconds);
        }
    }

TextConverted属性显示在textBox中,但在完成子例程之前会刷新。

有没有办法可以显示刷新UI?

2 个答案:

答案 0 :(得分:5)

永远不要在UI线程中睡觉。决不。如初。

您需要创建一个新线程来播放您的声音。

答案 1 :(得分:1)

在WPF应用程序中,您可以拥有多个执行“线程” - 在同一进程中处于活动状态的独立控制流。

您在代码中采用的方法包含用户界面线程上发生的所有事情 - 这是负责重新绘制屏幕的线程。当这个线程忙于运行你的摩尔斯电码程序时,它不能进行任何重新绘制。

您需要做的是将摩尔斯电码程序的执行移动到一个单独的线程上 - 这将允许UI线程及时处理重新绘制。实现此目的的最简单方法是使用BackgroundWorker对象。 (你可以在网上找到大多数使用WinForms的例子,但它也适用于WPF。)

但请注意,您正在进入一个中等复杂的开发领域。根据你对@EboMike的评论,你会发现这是一个挑战 - 有很多很多的新概念可以帮助你理解。一个好的起点可能是CodeProject上的Beginners guide to threading。 (我发现这是谷歌搜索,前几段读取确定 - YMMV。)

祝你好运。