在WPF应用程序显示BusyIndi​​cator控件(Display busyindicator

2019-09-28 00:19发布

我从WPF工具包扩展BusyIndi​​cator控件一个和我运行一个函数,需要一段时间才能完成。 如果我运行的时间在一个单独的线程耗时的任务,我得到一个NotSupportedException异常,因为我attemping将对象到不同的线程一个ObservableCollection。 我真的不希望花费大量的时间重构代码,如果可能的话......有没有办法,我可以设置该指标的知名度在一个单独的线程,而不是一个办法吗?

编辑

ThreadStart start = delegate()
  {
      System.Windows.Application.Current.Dispatcher.Invoke((Action)(() =>
          {
              IsBusy = true;
          }));
   };

new Thread(start).Start();                                
longRunningFunction();

这并没有为我工作的。

Answer 1:

您应该能够使用Dispatcher为这样的事情。 例如

Application.Current.Dispatcher.Invoke((Action)(() =>
{
    _indicator.Visibility = Visibility.Visible;
}));

这将导致代码要在UI线程上运行。

还有更多信息(包括如何“正确”这样做,用CheckAccess在它,这样的) 线程模型的参考 。



Answer 2:

你不能从一个后台工作访问的UI控件。 你平常做的是设置在IsBusy为true调用BackgroundWorker.RunWorkerAync(前),然后在BackgroundWorker.RunWorkerCompleted事件处理程序,你会在IsBusy设置为false。 Seomthing这样的:

Backgroundworker worker = new BackgroundWorker();
worker.DoWork += ...
worker.RunWorkerCompleted += delegate(object s, RunWorkerCompletedEventArgs args)
{
     IsBusy = false;
};
IsBusy = true;
worker.RunWorkerAsync();

您可以使用调度的项目在DoWork的事件hanlder添加到您的ObservableCollection一段时间。

编辑 :这里是完整的解决方案

        private void Button_Click(object sender, RoutedEventArgs e)
    {
        //on UI thread
        ObservableCollection<string> collection;

        ThreadStart start = delegate()
        {
            List<string> items = new List<string>();
            for (int i = 0; i < 5000000; i++)
            {
                items.Add(String.Format("Item {0}", i));
            }

            System.Windows.Application.Current.Dispatcher.Invoke((Action)(() =>
            {
                //propogate items to UI
                collection = new ObservableCollection<string>(items);
                //hide indicator
                _indicator.IsBusy = false;
            }));
        };
        //show indicator before calling start
        _indicator.IsBusy = true;
        new Thread(start).Start();      
    }


文章来源: Display busyindicator in wpf application