C# Action 定义委托有什么优点?

marklr 2013-09-04 08:41:27
假设我在某个后台线程里面要使用 Action 定义一个委托更新一个pictureBox1 的图片应该怎么写?
...全文
1558 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
夜色镇歌 2013-09-05
  • 打赏
  • 举报
回复
Action就是定义好的委托
  • 打赏
  • 举报
回复
引用 3 楼 marklr 的回复:
我有点想不明白, 其实 VS 在这方面是不是设计的不科学(还是微软认为这样更具灵活性),我要更新某个控件的数值,c#的内部系统直接帮我判断各个线程的先后来更新就是了,为什么一定要还要搞个委托要我们去写的这么复杂,就好像我想更新某个Textbox,无论我在哪个线程里面操作,如果能够直接写Textbox="123" 就是了,多么的简单. 有没有哪个高手解释一下.
这里的关键点就是微软建议你在创建控件的线程上更新控件,但这并不意味着你不能在其他的线程上直接对控件进行更新。
  • 打赏
  • 举报
回复
引用 3 楼 marklr 的回复:
我有点想不明白, 其实 VS 在这方面是不是设计的不科学(还是微软认为这样更具灵活性),我要更新某个控件的数值,c#的内部系统直接帮我判断各个线程的先后来更新就是了,为什么一定要还要搞个委托要我们去写的这么复杂,就好像我想更新某个Textbox,无论我在哪个线程里面操作,如果能够直接写Textbox="123" 就是了,多么的简单. 有没有哪个高手解释一下.
1,"就好像我想更新某个Textbox,无论我在哪个线程里面操作,如果能够直接写Textbox="123" 就是了,多么的简单." 为了线程安全,微软建议你在创建控件的那个线程里更新控件,如果只是Textbox="123" ,CLR怎么知道你是想做线程安全的操作还是非线程安全的操作呢? 2 “为什么一定要还要搞个委托要我们去写的这么复杂” 委托跟多线程情况下更新控件没有什么必然的关系,它只是指定了你更新控件的时候执行的具体动作。
luochaowei 2013-09-05
  • 打赏
  • 举报
回复
建议楼主 多看看msdn 上面对action做了很详细的讲解 http://msdn.microsoft.com/zh-cn/library/vstudio/018hxwa8.aspx
tcmakebest 2013-09-05
  • 打赏
  • 举报
回复
只不过就是系统预先定义了一组委托类型,直接使用罢了,如果没有也只需要一行或几行代码就可替代了。 由于是泛型参数,所以在1至4个参数的情况就不需要自己另外定义了。
xiaogui340 2013-09-05
  • 打赏
  • 举报
回复
省点代码工作
happytonice 2013-09-04
  • 打赏
  • 举报
回复
这东西看上去有点复杂,可是不用可能更复杂。
threenewbee 2013-09-04
  • 打赏
  • 举报
回复
引用 3 楼 marklr 的回复:
我有点想不明白, 其实 VS 在这方面是不是设计的不科学(还是微软认为这样更具灵活性),我要更新某个控件的数值,c#的内部系统直接帮我判断各个线程的先后来更新就是了,为什么一定要还要搞个委托要我们去写的这么复杂,就好像我想更新某个Textbox,无论我在哪个线程里面操作,如果能够直接写Textbox="123" 就是了,多么的简单. 有没有哪个高手解释一下.
并非微软故意要搞复杂,只是界面更新需要调用底层的操作系统代码,而这个过程不是线程安全的。所以必须让UI线程自己处理。之所以编译器不自动将跨线程操作的细节隐藏起来,是因为这样才是打破语法规则,同时增加复杂性的举措。也许你觉得不够简洁,但是本来C#是给程序员用的,而不是给培训班教学的玩具。
marklr 2013-09-04
  • 打赏
  • 举报
回复
我有点想不明白, 其实 VS 在这方面是不是设计的不科学(还是微软认为这样更具灵活性),我要更新某个控件的数值,c#的内部系统直接帮我判断各个线程的先后来更新就是了,为什么一定要还要搞个委托要我们去写的这么复杂,就好像我想更新某个Textbox,无论我在哪个线程里面操作,如果能够直接写Textbox="123" 就是了,多么的简单. 有没有哪个高手解释一下.
threenewbee 2013-09-04
  • 打赏
  • 举报
回复
Action委托没有什么特殊的,它相当于你定义这样一个委托:void delegate MyDelegate(); 无参数无返回值。 this.Invoke(new delegate { pictureBox1.Image = xxx; }); this.Invoke(new Action(() => pictureBox1.Image = xxx)); 都是一样的
人生导师 2013-09-04
  • 打赏
  • 举报
回复
pictureBox1.BeginInvoke(new Action(()=>this.pictureBox1.Image=new Bitmap("图片地址")));

110,538

社区成员

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

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

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