C# winform的几个问题,多线程,匿名委托,菜鸟求指导

zhangshuqiang123 2011-09-23 12:38:16
最近写程序的过程中遇到两个问题:
问题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);
这种方法的,这是不是就是将一个方法绑定到一个事件上去,参考了别人的匿名委托的例子,于是现在我改用下面这种匿名委托方法,编译没问题,想问的是,这种方法有效吗?可行吗?比起上面那种,有什么优点?

   powerData = new PowerData();
powerData.ShowChange += delegate(PORT_STATUS.COM_STATUS STATUS)
{
powerData_ShowChange(STATUS);
};



...全文
332 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhangshuqiang123 2011-09-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 stonespace 的回复:]
1.lock(list)是好方法,这样可以保证list不会被多个线程同时操作,我也经常这么干,

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

哦,只是我的实际应用中,两个线程操做那个List都是很平凡的,这样会不会影响效率和显示呀,因为读取数据显示,表示的是一个实时的过程,用lock(list)会不会影响显示结果,出现一顿一顿的样子。
2.我上面那样写匿名委托会不会导致其他一些问题,因为现在我改称匿名委托之后,出现了一些问题,不知道是不是这中方法引起的。
zhangshuqiang123 2011-09-23
  • 打赏
  • 举报
回复
我上面那么用可行吗?应该是对的哦,因为现在出现了一些问题,我不敢确定,我上面那么写是否会引起问题。

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

2.匿名委托没多少好处,也没坏处,用不用都可以,
[/Quote]
逐风 2011-09-23
  • 打赏
  • 举报
回复
1。
同时启动另一个线程(Timer)定时的去读取数据 属于“主线程”
lock 如果死锁。。。 你懂得。。。
2。匿名委托的好处就是,省代码
机器人 2011-09-23
  • 打赏
  • 举报
回复
匿名委托,再演变就是 lambda 了,你上面的写法:

powerData.ShowChange += delegate(PORT_STATUS.COM_STATUS STATUS)
{
powerData_ShowChange(STATUS);
};

可以写为:
powerData.ShowChange += (s) => { powerData_ShowChange(s); };

当一些delegate只用到一次(或者少数),为这个delegate再定义一个方法,从阅读上还有编码效率上都不如匿名代理或者lambda来得简洁。
huke1209 2011-09-23
  • 打赏
  • 举报
回复
我要分不好意思!
xiaoyu821120 2011-09-23
  • 打赏
  • 举报
回复
对于多线程来说,追求性能的话,尽量不要用lock,所以为了稳定,尽量不要用公共变量。合理的分割是最重要的。
stonespace 2011-09-23
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zhangshuqiang123 的回复:]

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

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


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

lock(list)会把整个list锁起来然后再操作,所以显示应该不会有效率问题,一般,如果list不是很大,完全的内存操作速度很快,不会在界面上感觉停顿,

你写的匿名委托很简单,我不太熟悉匿名委托,不过看起来应该没有问题,
stonespace 2011-09-23
  • 打赏
  • 举报
回复
1.lock(list)是好方法,这样可以保证list不会被多个线程同时操作,我也经常这么干,

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

110,532

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧