2011-09-08 51 views
1

的UI这是我使用的功能:如何更新,当我使用了Thread.Sleep

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属性在一个文本框显示,而是被刷新,直到完成子程序。

有没有一种方法可以显示刷新UI?

+1

[This question](http://stackoverflow.com/questions/6117293/synchronous-wait-without-blocking-the-ui-thread/6117313)似乎是相似/相关的。 –

回答

5

从不睡在UI线程中。决不。永远。

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

+0

对不起,我不是WPF的专家。该子程序按下命令(按钮)执行。当你说一个新的线程时,你是什么意思? – Darf

+0

@OscarFimbres:一个新的[主题](http://msdn.microsoft.com/en-us/library/system.threading.thread.aspx)。另请参见:[线程和线程](http://msdn.microsoft.com/zh-cn/library/6kac2kdh.aspx) –

1

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

您在代码中采取的方法在用户界面线程上发生了一切 - 这是负责重新绘制屏幕的线程。当这个线程忙于运行你的莫尔斯码例程时,它不能进行任何重绘。

您需要做的是将您的莫尔斯码例程的执行移至单独的线程 - 这将允许UI线程及时处理重新绘制。最简单的方法是使用一个BackgroundWorker对象。 (你可以在网上找到大多数使用WinForms的例子,但是WPF也能正常工作。)

但是请注意,你正在进入一个中等复杂的开发领域。根据你对@EboMike的评论,你会发现这是一个挑战 - 有很多的新概念让你的头。开始的一个好地方可能是CodeProject上的Beginners guide to threading。 (我发现这与谷歌搜索和前几个段落读Ok - YMMV。)

祝你好运。