假设我在某个后台线程里面要使用 Action 定义一个委托更新一个pictureBox1 的图片应该怎么写?

解决方案 »

  1.   

    pictureBox1.BeginInvoke(new Action(()=>this.pictureBox1.Image=new Bitmap("图片地址")));
      

  2.   

    Action委托没有什么特殊的,它相当于你定义这样一个委托:void delegate MyDelegate(); 无参数无返回值。this.Invoke(new delegate { pictureBox1.Image = xxx; });
    this.Invoke(new Action(() => pictureBox1.Image = xxx));
    都是一样的
      

  3.   

    我有点想不明白, 其实 VS 在这方面是不是设计的不科学(还是微软认为这样更具灵活性),我要更新某个控件的数值,c#的内部系统直接帮我判断各个线程的先后来更新就是了,为什么一定要还要搞个委托要我们去写的这么复杂,就好像我想更新某个Textbox,无论我在哪个线程里面操作,如果能够直接写Textbox="123" 就是了,多么的简单.有没有哪个高手解释一下.
      

  4.   


    并非微软故意要搞复杂,只是界面更新需要调用底层的操作系统代码,而这个过程不是线程安全的。所以必须让UI线程自己处理。之所以编译器不自动将跨线程操作的细节隐藏起来,是因为这样才是打破语法规则,同时增加复杂性的举措。也许你觉得不够简洁,但是本来C#是给程序员用的,而不是给培训班教学的玩具。
      

  5.   

    建议楼主 多看看msdn  上面对action做了很详细的讲解  http://msdn.microsoft.com/zh-cn/library/vstudio/018hxwa8.aspx
      

  6.   

    1,"就好像我想更新某个Textbox,无论我在哪个线程里面操作,如果能够直接写Textbox="123" 就是了,多么的简单."
    为了线程安全,微软建议你在创建控件的那个线程里更新控件,如果只是Textbox="123" ,CLR怎么知道你是想做线程安全的操作还是非线程安全的操作呢?2 “为什么一定要还要搞个委托要我们去写的这么复杂”
    委托跟多线程情况下更新控件没有什么必然的关系,它只是指定了你更新控件的时候执行的具体动作。