界面没有改变 - winforms

use*_*683 0 c# user-interface winforms

我有一个函数,当函数启动时,我想显示一些UI组件然后开始工作,最后,我想从那里擦除那些组件.问题是我没有在表单上看到UI的变化.

我这样做的功能是:

public void Processor()
{
    // ------------- SETTING UI COMPONENTS 

    lblProgress.Visible = true;
    progressBar.Visible = true;
    btnStop.Visible = true;

    // ------------- WORKING

    int counter = 0, percent = 0;
    foreach (string url in Urls)
    {
        .... WORKING THAT TAKES TIME

        counter += 1;
        percent = ((counter * 100) / Urls.Count());

        // ------------- MODIFYING UI COMPONENTS
        // Modification doesn't appear on the form while running

        lblProgress.Text = "Progress: " + (percent > 100 ? 100 : percent) + "%";
        progressBar.Value = percent;
    }

    // ------------- SETTING UI COMPONENTS

    lblProgress.Visible = false;
    progressBar.Visible = false;
    btnStop.Visible = false;
    lblDone.Visible = true;
}
Run Code Online (Sandbox Code Playgroud)

有人可以帮忙吗?如果我做错了,请告诉我.

EZI*_*EZI 5

@ user2831683,我想你现在知道使用Application.DoEvents是不太可取的.这是您可以使用的另一种选择:

async public void Processor() //see the "async" keyword
{
   //SETTING UI COMPONENTS 

   foreach (string url in Urls)
   {
        await Task.Run(() =>
        {
             //.... WORKING THAT TAKES TIME

        });

        //MODIFYING UI COMPONENTS
   }
}
Run Code Online (Sandbox Code Playgroud)

虽然DoEvents使您的代码看起来很有效,但您的UI仍然会在大多数情况下被您的工作阻止.这种方法将允许您的UI更顺畅地更新(例如,在移动窗口等时)

PS:原始代码中唯一的变化是部分//.... WORKING THAT TAKES TIME,它被Task替换