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

问题描述 投票:0回答:1

我为我的程序添加一个循环只是为了检查一些东西......(用于验证)

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);}}} Part它现在正在工作。为什么这段代码会导致问题。我用过using System.Threading.Tasks;。任何想法或我可以使用其他延迟功能......等待你的帮助。谢谢..

c# forms timer delay thread-sleep
1个回答
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();却没有。它实际上返回并让线程继续执行它以前执行的任何操作,并在完成等待时通知线程,以便线程稍后可以返回到您的函数并继续运行您的代码。 (这简化了异步和等待在C#中的工作方式)

© www.soinside.com 2019 - 2024. All rights reserved.