界面上一个 进度条 PB1  一个label  LB1 一个TreeView tree,现在建了两个进程,分别进行操作,鼠标拖动窗口无卡顿。但如果在Code1处访问 tree 【TreeViewItem item = (TreeViewItem)tree.SelectedItem;】,会出现跨线程问题,若把 thr 改为 this.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new MyDelegate(thread1));界面就会产生明显的卡顿现象。怎么解决?
Thread thr;
        Thread thr1;
        private delegate void MyDelegate();
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            PB1.Maximum = 10;
            PB1.Value = 0;
            thr = new Thread(new ThreadStart(thread1));
            thr.IsBackground = true;
            thr.Start();            thr1 = new Thread(new ThreadStart(thread2));
            thr1.IsBackground = true;
            thr1.Start();
        }
        private void thread1()
        {
            //Code1   TreeViewItem item = (TreeViewItem)tree.SelectedItem;
            for (int i = 0; i < 10; i++)
            {
                Thread.Sleep(1000);
                this.Dispatcher.Invoke(DispatcherPriority.Normal, new MyDelegate(changelabel));
            }
        }
        private void thread2()
        {
            for (int i = 0; i < 10; i++)
            {
                Thread.Sleep(1000);
                this.Dispatcher.Invoke(DispatcherPriority.Normal, new MyDelegate(changepb));
            }
        }
        private void changelabel()
        {
            LB1.Content = (Convert.ToInt32(LB1.Content) + 1).ToString();
        }
        private void changepb()
        {
            PB1.Value = PB1.Value + 1;
        }WPF多线程

解决方案 »

  1.   

    好蛋疼啊。你就不能开一个线程做这两件事情?然后主线程弹出一个loading界面?
      

  2.   

    Code1处的代码完全可以删除,你只是获取了SelectedItem,但是没对它做任何操作,完全没有存在的意义。最后WPF应该使用后台绑定对象修改来间接修改前台的显示,不推荐直接对界面元素操作,我通过绑定对象的修改多线程批量修改列表数据都没一点卡过。
      

  3.   


    谢谢提示。  如果在线程中,需要获取某一个或几个界面元素相关属性信息来进行下一个过程,如何操作呢?
    有没有例子学习?谢谢
    数据绑定后,绑定的数据直接反映你绑定的元素的对应属性,直接操作绑定的数据就好了。当然前提是你想获取的属性是依赖项属性才能绑定。非依赖项属性就写个Behaviors就好了。
      

  4.   

    谢谢。 
    若需要对TreeView进行获取和操作,如SelectedItem、items等,有例子学习吗?
      

  5.   

    谢谢。 
    若需要对TreeView进行获取和操作,如SelectedItem、items等,有例子学习吗?
    http://www.codeproject.com/Articles/26288/Simplifying-the-WPF-TreeView-by-Using-the-ViewMode
    这个挺好的,可以作为参考。