关于多线程,数据绑定及类存储的有关问题
关于多线程,数据绑定及类存储的问题
MainPage.xaml.cs
Class1.cs
请原谅这两段程序的诸多错误,我主要还是参考别人的程序来写,对C#的架构不这么了解。我想问的是,如何在多线程下和多线程外都能修改Class1这个类。我的面板上的显示控件式与这个Class1有数据绑定的。然后实现多线程下刷新数据的作用。
------解决思路----------------------
这样应该执行不了,对Second的修改会影响到ui,所以必须在ui线程,在wp里面,无论new 一个thread还是task都会默认在后台线程执行,只能把对thread的赋值放到dispatcher.begininvoke()里面,注意前面这个函数会将切换到ui但是在你new的这个task里面是异步的,想要同步执行需要一些线程锁来辅助控制,比较方便的传统的可以用AutoResetEvent,新的解决方案是 TaskCompletionSource,具体的百度吧
------解决思路----------------------
改值没啥问题,它本身不涉及线程,你随便怎么改,但是你要知道,触发PropertyChanged事件这事,必须要在UI线程才行,所以一般MVVM框架都会自带这些方法。
想要正常使用,只要保证你的PropertyChanged在UI线程上执行就可以了,你可以修改一下你的OnPropertyChanged方法,把UI的Dispatcher传进来,然后BeginInvoke。
------解决思路----------------------
个人建议加上BEGININVOKE,比较好。
------解决思路----------------------
什么事多个CS???你想说的是在其他类中访问同一份数据是吧。
单件模式正好满足你需要。具体的写法网上一大推,自己找吧。
插播点题外话,C#的编译器是不在乎你的文件名和类名是否一样,以及一个类也是可以分别写在多个文件中的、一个文件中也可以写多个类的。
MainPage.xaml.cs
Task A;
public MainPage()
{
InitializeComponent();
Class1 cl = new Class1
{
Second = 600
};
collecion.Add(cl);
A = new Task(() => Task_A());
A.Start();
}
private void Task_A()
{
Class1 cl = new Class1
{
Second = 600
};
collecion.Add(cl);
}
Class1.cs
public class Class1: INotifyPropertyChanged
{
int second;
public event PropertyChangedEventHandler PropertyChanged;
public Class1()
{
}
public int Second
{
set
{
if (value != second)
{
second = value;
OnPropertyChanged(new PropertyChangedEventArgs("Second"));
}
}
get
{
return second;
}
}
protected virtual void OnPropertyChanged(PropertyChangedEventArgs args)
{
if (PropertyChanged != null)
PropertyChanged(this, args);
}
}
请原谅这两段程序的诸多错误,我主要还是参考别人的程序来写,对C#的架构不这么了解。我想问的是,如何在多线程下和多线程外都能修改Class1这个类。我的面板上的显示控件式与这个Class1有数据绑定的。然后实现多线程下刷新数据的作用。
------解决思路----------------------
这样应该执行不了,对Second的修改会影响到ui,所以必须在ui线程,在wp里面,无论new 一个thread还是task都会默认在后台线程执行,只能把对thread的赋值放到dispatcher.begininvoke()里面,注意前面这个函数会将切换到ui但是在你new的这个task里面是异步的,想要同步执行需要一些线程锁来辅助控制,比较方便的传统的可以用AutoResetEvent,新的解决方案是 TaskCompletionSource,具体的百度吧
------解决思路----------------------
改值没啥问题,它本身不涉及线程,你随便怎么改,但是你要知道,触发PropertyChanged事件这事,必须要在UI线程才行,所以一般MVVM框架都会自带这些方法。
想要正常使用,只要保证你的PropertyChanged在UI线程上执行就可以了,你可以修改一下你的OnPropertyChanged方法,把UI的Dispatcher传进来,然后BeginInvoke。
------解决思路----------------------
个人建议加上BEGININVOKE,比较好。
------解决思路----------------------
什么事多个CS???你想说的是在其他类中访问同一份数据是吧。
单件模式正好满足你需要。具体的写法网上一大推,自己找吧。
插播点题外话,C#的编译器是不在乎你的文件名和类名是否一样,以及一个类也是可以分别写在多个文件中的、一个文件中也可以写多个类的。