代码之家  ›  专栏  ›  技术社区  ›  Chaowlert Chaisrichalermpol

是否有立即更新用户界面的命令?

  •  3
  • Chaowlert Chaisrichalermpol  · 技术社区  · 15 年前

    我想用这段代码更新从运行1到100的进度条。

    for (int i = 0; i <= 100; i++) {
        System.Threading.Thread.Sleep(100);
        progressBar1.Value = i;
    }
    

    但结果是,用户界面会一直冻结,直到循环结束。

    我知道 Dispatcher 可以,但我不想拆分函数。

    有什么命令可以像..一样立即更新用户界面吗?

    for (int i = 0; i <= 100; i++) {
        System.Threading.Thread.Sleep(100);
        progressBar1.Value = i;
        UpdateUINow();
    }
    

    编辑:我使用的是wpf,我使用的是thread.sleep来模拟长时间运行的过程。

    事实上,我想要任何喜欢的命令 Application.DoEvents . 但在WPF中找不到这个命令。

    5 回复  |  直到 15 年前
        1
  •  15
  •   Jon Skeet    15 年前

    拜托 不要在UI线程中睡觉。它会冻结你的用户界面-这是一件坏事。

    要么有某种类型的计时器(使用正确的计时器,您应该能够让它在UI线程中触发),要么使用单独的线程(通过 BackgroundWorker 新的独立线程,或 ThreadPool )并让它调用UI线程来更新它。

    Application.DoEvents 是WinForms中的一个黑客解决方案,但事实上您提到了 Dispatcher 建议你使用WPF-是这样吗?您应该使用的计时器类型(如果您想使用该解决方案)将取决于您使用的UI框架。

        2
  •  2
  •   Stephen Wrighton    15 年前

    另一种选择是使用一个后台工作人员(一个线程工具在这里有点多余,但技术上可以使用),并让它报告进度。

        3
  •  2
  •   Scott Arrington    15 年前

    我会用C# BackgroundWorker 更新用户界面。这并不像您期望的那样工作,因为thread.sleep()正在冻结您的UI线程。

    编辑:你想要的教程 here

        4
  •  1
  •   Dave    15 年前

    同上,在主(GUI)线程中睡觉——不惜一切代价避免它。虽然你不想调度员,但我还是建议你尝试(类似于)以下方法:

    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
  •  -2
  •   luvieere    15 年前

    看看是否 DoEvents 在这里能帮你。