日期:2014-05-18  浏览次数:21106 次

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.匿名委托没多少好处,也没坏处,用不用都可以,

------解决方案--------------------
探讨

引用:
1.lock(list)是好方法,这样可以保证list不会被多个线程同时操作,我也经常这么干,

2.匿名委托没多少好处,也没坏处,用不用都可以,


哦,只是我的实际应用中,两个线程操做那个List都是很平凡的,这样会不会影响效率和显示呀,因为读取数据显示,表示的是一个实时的过程,用lock(list)会不会影响显示结果,出现一顿一顿的……

------解决方案--------------------
对于多线程来说,追求性能的话,尽量不要用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。匿名委托的好处就是,省代码