代码之家  ›  专栏  ›  技术社区  ›  Robaticus

可以用后台人员的ReportProgress来做其他事情吗?

  •  0
  • Robaticus  · 技术社区  · 14 年前

    如果我尝试添加到DoWork中的observateCollection,由于线程同步问题,它无法工作。在UI线程上实现这一点的最简单方法似乎是执行ReportProgress()并从那里更新集合。

    我的问题是:从哲学上和技术上讲,从ReportProgress处理程序更新UI可以吗,即使“根据法律条文”我实际上并没有报告进度。

    *编辑:代码使用调度程序计时器工作*

    视图模型

    class MyViewModel
    {
        public ObservableCollection<string> MyList { get; set; }
    
        public MyViewModel()
        {
            MyList = new ObservableCollection<string>();
        }
    }
    

    “teh codez”-只是一个示例,不是我实际的应用程序代码。

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
    
            MyViewModel mvm = new MyViewModel();
            this.DataContext = mvm;
    
            DispatcherTimer mytimer = new DispatcherTimer();
            mytimer.Interval = TimeSpan.FromSeconds(5.0);
            mytimer.Tick += new EventHandler(mytimer_Tick);
    
            mytimer.Start();
    
    
        }
    
        void mytimer_Tick(object sender, EventArgs e)
        {
            ((DispatcherTimer)sender).Stop();
    
            MyViewModel mvm = this.DataContext as MyViewModel;
            mvm.MyList.Insert(0, DateTime.Now.ToLongTimeString());
    
            ((DispatcherTimer)sender).Start();
        }
    

    3 回复  |  直到 14 年前
        1
  •  1
  •   Craig Vermeer    14 年前

    如果您在应用程序中实现轮询类型的功能,那么使用以一定间隔触发的Dispatcher可能更有意义,而不是在BackgroundWorker中不断循环。

    http://msdn.microsoft.com/en-us/library/system.windows.threading.dispatchertimer.aspx

        2
  •  1
  •   Wonko the Sane    14 年前

    当然。这就是EventArgs的UserState的设计目的。

        3
  •  1
  •   Nir    14 年前

    我不会这么做的

    它“感觉”像是将来会引起问题的东西(可能是几年后其他人尝试添加特性时,可能是升级此代码或将其移植到具有稍微不同的ReportProgress实现的环境时)。

    我只想使用Dispatcher.BeginInvoke(我也尽量避免使用Invoke,因为它会让一个线程等待另一个线程,并首先降低使用多线程的效率)。

    但是,在有些地方,仅仅使用ReportProgress是正确的选择,您需要自己决定适合您的具体情况的最佳做法(我最讨厌的是重视“最佳实践”或“体系结构”,而不是生产实际工作的软件)