【问题标题】:Is there any command to update UI immediately?是否有任何命令可以立即更新 UI?
【发布时间】:2010-12-18 09:56:08
【问题描述】:

我想使用此代码将进度条从运行 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 中找不到这个命令。

【问题讨论】:

    标签: c# wpf user-interface asynchronous dispatcher


    【解决方案1】:

    不要在 UI 线程中休眠。它会冻结你的 UI - 这是一件坏事。

    要么有某种计时器(使用正确的计时器,你应该能够让它在你的 UI 线程中触发)或使用单独的线程(通过BackgroundWorker,一个新的单独线程,或者ThreadPool) 并使其回调 UI 线程以更新它。

    Application.DoEvents 是 WinForms 中的一个 hacky 解决方法,但您提到 Dispatcher 的事实表明您正在使用 WPF - 是这样吗?您应该使用的计时器类型(如果您想使用该解决方案)将取决于您使用的 UI 框架。

    【讨论】:

    • Invoke(delegateInstance) 将在 WinForms 中完成这项工作。
    • +1 很高兴有人能够在我吃鸡手指的同时应对不断增长的DoEvents 推荐列表。
    【解决方案2】:

    另一种选择是使用 BackgroundWorker(在这里使用 ThreadPool 有点过分,但从技术上讲可以使用)并让它报告进度。

    【讨论】:

      【解决方案3】:

      我会使用 C# BackgroundWorker 来更新您的 UI。这不像您期望的那样工作,因为 Thread.Sleep() 正在冻结您的 UI 线程。

      编辑:教程可以做更多你想要的here

      【讨论】:

        【解决方案4】:

        在主 (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++;
            }
        }
        

        【讨论】:

          【解决方案5】:

          看看DoEvents能不能帮到你。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-07-10
            • 2022-08-24
            • 1970-01-01
            • 2011-10-23
            • 1970-01-01
            相关资源
            最近更新 更多