[英]Is there any command to update UI immediately?
我想使用此代码更新从1到100的进度条。
for (int i = 0; i <= 100; i++) {
System.Threading.Thread.Sleep(100);
progressBar1.Value = i;
}
但结果是,UI冻结直到循环完成。
我知道Dispatcher
可以提供帮助,但我不想拆分功能。
是否有任何命令立即更新UI像..
for (int i = 0; i <= 100; i++) {
System.Threading.Thread.Sleep(100);
progressBar1.Value = i;
UpdateUINow();
}
编辑:我正在使用WPF,我使用Thread.Sleep来模拟长时间运行的进程。
实际上,我想要任何喜欢Application.DoEvents
命令。 但是我在WPF中找不到这个命令。
请不要在UI线程中睡觉。 它会冻结你的UI - 这是一件坏事。
要么有一个类型的计时器(使用正确的计时器,你应该能够在你的UI线程中启动它)或使用一个单独的线程(通过BackgroundWorker
,一个新的单独的线程,或ThreadPool
)和make它回调UI线程来更新它。
Application.DoEvents
是WinForms中的一个hacky变种方法,但你提到Dispatcher
建议你使用WPF的事实是这样的吗? 您应该使用的计时器类型(如果您要使用该解决方案)将取决于您正在使用的UI框架。
另一种方法是使用BackgroundWorker(ThreadPool在这里有点过分但技术上可以使用)并让它报告进度。
我会使用C# BackgroundWorker来更新您的UI。 这不像你期望的那样工作,因为Thread.Sleep()冻结你的UI线程。
编辑:教程, 在这里做更多你想要的
在主(GUI)线程中睡觉同样 - 不惜一切代价避免它。 虽然您不想使用Dispatcher,但我仍然建议尝试(类似)这样:
public partial class Window1 : Window
{
DispatcherTimer _timer = new DispatcherTimer();
public Window1()
{
InitializeComponent();
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
progressBar1.Value = 0;
progressBar1.Maximum = 100;
_timer.Interval = TimeSpan.FromMilliseconds( 100);
_timer.Tick += ProgressUpdateThread;
_timer.Start();
}
private void ProgressUpdateThread( object sender, EventArgs e)
{
progressBar1.Value++;
}
}
看看DoEvents是否可以帮助您。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.