由于控件中定义的加载文件的方法处理数据较多速度比较慢,想放到工作线程中处理。但是由于控件对象不能够在创建的工作线程调用。所有有什么办法既可以调用控件对象又可以在工作线程中运行,避免出现主程序阻塞的状态

解决方案 »

  1.   

    使用Invoke来调用方法,比如:
    private void button1_Click(object sender, EventArgs e)
    {
    Thread th = new Thread(aa);
    th.Start();
    }delegate void somedle();
    private void aa()
    {
    if (this.InvokeRequired)
    {
    somedle sd = new somedle(aa);
    this.Invoke(sd);
    return;
    }
    ShowChar('A');
    }
    public void ShowChar(char ch)
    {
    lock (this)
    {
    textBox1.Text += ch;
    }
    }
      

  2.   

    Control.CheckForIllegalCrossThreadCalls = false;
    这个也可以。
      

  3.   

    To:hbxtlhx 
    Invoke是不可以的因为该方法是运行在UI线程中的,这样又等于运行到了主窗体线程中。这个我已经考虑过了。不过还是谢谢你
      

  4.   


    private void button1_Click(object sender, EventArgs e)
    {
        Thread th = new Thread(aa1);
        th.Start();
    }private void aa1()
    {
          //耗时函数
           aa();//访问主线程的控件必须使用委托Invoke
          //耗时函数
    }    delegate void somedle();
    private void aa()
    {
        if (this.InvokeRequired)
        {
            somedle sd = new somedle(aa);
            this.Invoke(sd);
            return;
        }
        ShowChar('A');
    }
    public void ShowChar(char ch)
    {
        lock (this)
        {
            textBox1.Text += ch;
        }
    }
      

  5.   

    hbxtlhx,你写的确实有些不一样,我再仔细看看,别早造成冤家错案了
      

  6.   

    问题:
    1、aa()必须加载耗时代码的中间吗?
    2、最后ShowCar到底什么作用程序都已经执行完了,锁它还有什么意义?
    3、有点想递归调用aa方法的那个Invoke是不是间断的将信息返回给控件的线程?
      

  7.   

    hbxtlhx 的代码应该把Invoke换成BegainInvoke,这样避免多个线程同时调用该段代码,
    crossrowman的代码正解!
      

  8.   

    在控件中开启一个工作线程进行数据处理,然后利用delegate/event在线程中定义需要的事件支持,数据处理到相应的地方,调用事件,在控件和主UI中定义事件的实现,是否可以解决问题。
    或者利用消息功能,然后在控件和主UI中的void DefWndProc(ref Message m)功能进行处理