none
开启线程更新数据集合,在线程中给一个对象的依赖属性赋值,会抛出“调用线程无法访问此对象,因为另一个线程拥有该对象。”的异常,如何解决这个问题? RRS feed

  • 问题

  • 由于依赖属性对内存占用方面的优化性能,依赖属性在声明时不赋值时不会分配内存空间,所以用依赖属性存值,减少对象声明时为某个属性不赋值时的内存空间分配。

    我开启线程,在更新数据集合时,为依赖属性赋值时抛出抛出“调用线程无法访问此对象,因为另一个线程拥有该对象。”的异常,这个要怎么解决?难道依赖属性在线程中赋值使用需要做什么安全措施吗?另外更新是在ViewModel对象中的方法更新ListView绑定的集合数据

    public class Student:  NotificationProcess
        { public string Id
            {
                set;
                get;
            }
              public string Names
            {
                get
                { return (string)GetValue(NamesProperty); }
    
                set
                { SetValue(NamesProperty, value); }
    
            }
            public static readonly DependencyProperty NamesProperty
           = DependencyProperty.Register("Names", typeof(string), typeof(Student));
    
            private string name ;
            public string Name
            {
                get { return name; }
                set
                {
                    name = value;
                    this.RaisePropertyChanged("Name");
                }
            }
        }
    public class NotificationProcess : DependencyObject, INotifyPropertyChanged
        {
            public event PropertyChangedEventHandler PropertyChanged;
    
            public void RaisePropertyChanged(string propertyName)
            {
                this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
            }
        }

    我总担心一个实体对象20个属性,数据量过多的话会担心内存占用问题,不知道在有虚拟化容器的帮助下,有木有必要将一些属性设为依赖属性来在声明时节省内存分配




    2017年3月13日 8:03

答案

  • Hi 便携式家园,

    >>,不知道在有虚拟化容器的帮助下,有木有必要将一些属性设为依赖属性来在声明时节省内存分配

    据我了解,你可以不需要依赖属性来在声明。 内存过多的问题,我建议你可以在运行的时候去监控一下。看实际情况的内存消耗,在做一些优化措施。

    Best Regards,

    Yohann Lu


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2017年3月14日 7:10
    版主

全部回复


  • Hi 便携式家园,

    你可以尝试在线程中使用下面的方式更新数据集合

     System.Windows.Application.Current.Dispatcher.Invoke(new Action(() =>
                        {
                            //更新数据集合
                        }));


    Best Regards,

    Yohann Lu


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2017年3月14日 2:31
    版主

  • 你这个是可以,但是副作用是,不能在线程中实时更新显示了,我总担心一个实体对象20个属性,数据量过多的话会担心内存占用问题,不知道在有虚拟化容器的帮助下,有木有必要将一些属性设为依赖属性来在声明时节省内存分配



    2017年3月14日 5:58
  • Hi 便携式家园,

    >>,不知道在有虚拟化容器的帮助下,有木有必要将一些属性设为依赖属性来在声明时节省内存分配

    据我了解,你可以不需要依赖属性来在声明。 内存过多的问题,我建议你可以在运行的时候去监控一下。看实际情况的内存消耗,在做一些优化措施。

    Best Regards,

    Yohann Lu


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2017年3月14日 7:10
    版主