C# winform的几个问题,多线程,匿名委托,菜鸟求指导
最近写程序的过程中遇到两个问题:
问题1.多线程操作数据的问题,菜鸟就是菜鸟,之前写的程序从来都没考虑过多线程的问题,现在是出问题了,才想有必要去解决一下,对多线程了解太少,我的问题说起来很简单,都没牵扯到数据库。
具体描述:数据源是一个List<float>的全局变量,程序运行时,按下“开始”按钮,主线程中有一个事件在不停的接收数据,接收到数据之后,经过处理,就add到list数据源中;同时启动另一个线程(Timer)定时的去读取数据,显示在界面上,然后,显示多少个数据,就remove掉多少个数据,
这中间可能出现,在显示(remove)的过程中,主线程同时在往里面add,会提示“集合已修改的错误”
看了些多线程的东西,有三种方法,当然我之前只听过lock,基本上用的都是lock一个多线程执行的代码块,
看一些例子,在所有操作list的地方,用lock(list)直接锁定引用类型的变量,不知道这么做对不对,好不好?
没办法,基础太差,让你们笑话了
问题2:
一起用委托,都是用一个格式的方法写,也不知道用匿名委托,也不知道匿名委托有什么优点,
现在想学习一下,只知道匿名委托省略了委托的声明,
现在有这样一个实例,
类A,类B,
在A中写了一个公共的事件,在类B中声明了一个A类的对象。并且注册了A的事件,
B中注册事件关联到一个执行方法,以前都是用
powerData.ShowChange+=new PowerData.ShowChangeHandle(powerData_ShowChange);
这种方法的,这是不是就是将一个方法绑定到一个事件上去,参考了别人的匿名委托的例子,于是现在我改用下面这种匿名委托方法,编译没问题,想问的是,这种方法有效吗?可行吗?比起上面那种,有什么优点?
C# code
powerData = new PowerData();
powerData.ShowChange += delegate(PORT_STATUS.COM_STATUS STATUS)
{
powerData_ShowChange(STATUS);
};
------解决方案--------------------1.lock(list)是好方法,这样可以保证list不会被多个线程同时操作,我也经常这么干,
2.匿名委托没多少好处,也没坏处,用不用都可以,
------解决方案--------------------
------解决方案--------------------对于多线程来说,追求性能的话,尽量不要用lock,所以为了稳定,尽量不要用公共变量。合理的分割是最重要的。
------解决方案--------------------匿名委托,再演变就是 lambda 了,你上面的写法:
powerData.ShowChange += delegate(PORT_STATUS.COM_STATUS STATUS)
{
powerData_ShowChange(STATUS);
};
可以写为:
powerData.ShowChange += (s) => { powerData_ShowChange(s); };
当一些delegate只用到一次(或者少数),为这个delegate再定义一个方法,从阅读上还有编码效率上都不如匿名代理或者lambda来得简洁。
------解决方案--------------------1。
同时启动另一个线程(Timer)定时的去读取数据 属于“主线程”
lock 如果死锁。。。 你懂得。。。
2。匿名委托的好处就是,省代码