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)
有人可以帮忙吗?如果我做错了,请告诉我.
@ 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替换
| 归档时间: |
|
| 查看次数: |
40 次 |
| 最近记录: |