问高手个问题:
如果要在非UI主线程更新UI的话,必须使用Invoke方法调用委托更新UI。可是为何在子线程中调用PictureBox更新代码:
 Box.Image = bitmap;
 Box.Invalidate();
没有引发异常?而调用Box.Show()却会引发异常。求原因,求详情。

解决方案 »

  1.   

    请查看我的例子
    http://download.csdn.net/source/2976570
      

  2.   

    this.invole(new eventhandler(delegate
    {
       //写代码
    }));
      

  3.   

    楼主可以看一下MSDN上面的解释,如果要在子线程中跟新UI界面,最好按照下面的模式进行
    delegate void ShetShowStatus(bool bIsShow);ProgressBar PBSavePrjMsg = new ProgressBar();private void SetMsgSHowStatus(bool bIsShow)
            {
                if (this.PBSavePrjMsg.InvokeRequired)
                {
                    ShetShowStatusd = new ShetShowStatus(SetMsgSHowStatus);
                    this.Invoke(d, new object[] { bIsShow });
                }
                else
                {
                    PBSavePrjMsg.Visible = bIsShow;
                }
            }
      

  4.   

    哦,我问的不清楚吗?再说一下吧,怎么在子线程更新UI。我知道。我只是想问下。为何在子线程中,设置PictureBox的Image和Invalidate(),不采用Invoke的方式,也不会引发异常。这是为什么?伪代码如下:PictureBox box;
    public void Run()
    {
       new Thread(new ThreadStart(Test)).Start();
    }
    public Test()
    {
    //以下代码,在子线程中运行不会报错。并不需要使用Invoke,这是为什么?
       box.Image=bitmap;//更新一张图
       box.Invalidate(); //刷新
    }
      

  5.   

    不知道为什么,可能的解释是
    box.Invalidate(); //刷新跟刷新text比较,微软使用的是非托管方式实现的刷新Box上的图片(因为流专用非托管资源),所以,你不需要Invoke或这BeginInvoke
      

  6.   

    请查看MSDN的解释
    调用 Invalidate 方法并不强制同步绘制;若要强制同步绘制,请在调用 Invalidate 方法之后调用 Update 方法。 在不带参数的情况下调用此方法时,会将整个工作区添加到更新区域。
    更新图像的操作并不是在你的线程里完成的