C#“ Thread.Sleep”弄乱我的程序(窗体不显示)

时间:2018-09-01 12:57:56

标签: c# forms timer delay thread-sleep

我在程序中添加了一个循环,只是为了检查某事...(用于验证)

for (int i = 1; i < total; i++){
   for (int row = 0; row < 4; row++){
      for (int col = 0; col < 4; col++){ 
           pixel = block[i][row][col];
           label1.Text = pixel.R.ToString("X");
           System.Threading.Thread.Sleep(100);}}}

添加后,此循环程序有效,但表单未显示。我开始调试,我看到在这一行它停止了。不要再走了。

Application.Run(new Form1());

程序的基本开始。所以我隔离了System.Threading.Thread.Sleep(100);}}} 现在它正在工作。为什么这段代码会引起问题。我用了  using System.Threading.Tasks;。 任何想法或我都可以使用其他延迟功能...©等待您的帮助。谢谢你。

1 个答案:

答案 0 :(得分:1)

您永远都不应阻塞UI线程(通过睡眠或做一些繁重的工作),因为该线程只能处理UI事件(单击,重新渲染,调整大小)运行您的代码,不是两者都一样。如果必须从事件处理程序执行一些长时间运行的代码,则可以启动新线程来执行工作,也可以运行异步代码。

对于您来说,这样的事情应该可以正常工作:

public async void Form1_Load(object sender, EventArgs e) {
    for (int i = 1; i < total; i++){
       for (int row = 0; row < 4; row++){
          for (int col = 0; col < 4; col++){ 
               pixel = block[i][row][col];
               label1.Text = pixel.R.ToString("X");
               await Task.Delay();
          }
       }
    }
}

Sleep在等待时阻塞线程,而await Task.Delay();。它实际上会返回并让线程继续执行以前的操作,并在等待完成后 notify 通知线程,以便线程稍后可以返回您的函数并继续运行代码。 (这是异步和等待在C#中的工作方式的简化)