我要实现的功能是:
我的应用程序显示一对框form,form里有一picturebox控件,在初始化时已经绘制了bmp图片,同时我在显示form.showdialog的同时又创建了一新的线程,具体是 delegate定义已委托之后 用Begininvoke实现,现在我希望在新的线程里去操作主线程form的picturebox控件,不知道该如何将控件传递到新建的线程里,并可以安全的操作。
谢谢。

解决方案 »

  1.   

    有一种简单的方式是
     System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
    但说到安全,还是按微软推荐的方式去做。
      

  2.   

     public Form1()
            {
                InitializeComponent();
                changeTextDelegate = new ChangeTextDelegate(changeText);
            }        private void button1_Click(object sender, EventArgs e)
            {
                Thread t = new Thread(new ThreadStart(f)); 
                t.Start();
            }        delegate void ChangeTextDelegate();        ChangeTextDelegate changeTextDelegate;        void changeText()
            {
                textBox1.Text = "Hello";
            }        void f()
            {
                Invoke(changeTextDelegate);
            }随便写了段代码
      

  3.   


    先谢谢你,
    再问一下,
    我要显示的数据是在我创建的线程里产生的而且是循环产生,我希望就是每一个循环产生一个数据然后实时的通过主线程的控件显示出来,也就是说我一开始就显示一个form,在显示form的同时就创建一个新的线程,这个线程里去循环产生(获取)数据,然后每一个循环产生的数据实时的显示到我一开始的form里的一个控件里,当我的循环结束后能自动通知到form主线程,并终止新建的获取数据线程。
    我的上述功能该如何实现呢?
      

  4.   

    典型的问题。
    1.如果使用Control.Invoke或Control.BeginInvoke这里讲了很多,
    通过多线程为基于 .NET 的应用程序实现响应迅速的用户
    http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/misMultithreading.mspx
    为Windows应用创建简单的异步调用模式
    http://www.microsoft.com/china/MSDN/library/architecture/AsynCallPattern.mspx如果需要独立线程处理任务,而且还要跟踪任务进度同UI交互,这里两篇文章可以参考一下,
    使用BackgroundWorker组件进行异步操作编程
    http://blog.csdn.net/zhzuo/archive/2008/07/23/2699305.aspx
    实现增强的异步任务执行组件
    http://blog.csdn.net/zhzuo/archive/2008/07/23/2699847.aspx
    摘要:本文介绍如何在.NET中实现基于事件的异步模式组件。
      

  5.   

    此类异步调用推荐用AsyncOperation
    asyncOperation = AsyncOperationManager.CreateOperation(null);
    asyncOperation.Post()....可以避免枯燥的Dance of Invoke!
      

  6.   

    我用backgroundWorker1和Control.CheckForIllegalCrossThreadCalls = false;解决了
      

  7.   

    假设要让窗体的标题变成123,可以用以下代码操作delegate void action();
    public void MapMaxToMin()
            {
                Form1 frm = new Form1();
                    action invoke = delegate()
                    {
                        frm.Text = "123";
                    };
                    Variables.frm.Invoke(invoke);
                    
            }
    这是比较简单弱智的一种方法……
      

  8.   

    用BackgroundWorker可以省去很多线程间的传递操作。MSDN中有很好的例子