MethodInvoker

在程序需要读取CAD文件列表中的文件信息,这是一个非常费时的操作,所以希望通过多线程的方式来实现,并且可以随时中止。由于初次使用多线程,开始的时候采用独立的线程类,该类返回数据,在Thread.Join()方法等待线程结束后写入数据到窗体控件中,结果和单线程没有什么区别;后来查看资料通过使用MethodInvoker解决了这一问题,但是对于线程处理还是概念非常模糊,大家谁有这方面的心得、资料等共享学习学习。

     public  partial  class  frmMain : Form
    
{
        
private volatile bool _stoped = false;

        
private void btFilter_Click(object sender, EventArgs e)
        
{
            _stoped 
= false;
            Thread t 
= new Thread(new ThreadStart(StartNewThread));
            t.Start();
        }


        
private void btStop_Click(object sender, EventArgs e)
        
{
            _stoped 
= true;
        }


        
private void GetFileSize()
        
{
            btFilter.Enabled 
= false;
            
using (AutoCADConnector CAD = new AutoCADConnector())
            
{
                
foreach (ListViewItem t in lvSource.Items)
                
{
                    
if (!_stoped)
                    
{
                        AutoCAD.AcadDocument doc 
= CAD.Application.Documents.Open(t.SubItems[2].Text, true"");

                        
double[] p1 = new double[] 000 };    //右上角坐标
                        double[] p2 = new double[] 000 };    //左下角坐标
                        double scale = 0;                                  //缩放比例

                        p1 
= (double[])doc.GetVariable("EXTMAX");
                        p2 
= (double[])doc.GetVariable("EXTMIN");
                        scale 
= Convert.ToDouble(doc.GetVariable("DIMSCALE"));

                        
double w = Math.Ceiling((p1[0- p2[0]) / scale);
                        
double h = Math.Ceiling((p1[1- p2[1]) / scale);

                        doc.Close(
false"");

                        t.SubItems[
1].Text = string.Format("{0}*{1}  {2}", w, h, scale);
                        
//lvSource.Refresh();
                        
//Thread.Sleep(100);
                        Application.DoEvents();
                    }

                    
else
                        
break;
                }

            }

            btFilter.Enabled 
= true;

        }


        
private void StartNewThread()
        
{
            MethodInvoker me 
= new MethodInvoker(this.GetFileSize);
            
this.BeginInvoke(me);
        }


    }

 

 

跨线程调用控件之MethodInvoker

private void button1_Click(object sender, EventArgs e)  

        {

            Thread thread=new Thread(new ThreadStart(myname));

            thread.IsBackground=true;

            thread.Start();

             // 启动一个线程。

        }

        private void myname()

        {

           MethodInvoker mi = new MethodInvoker(hello);

            //创建一个委托,hello是该委托所托管的代码,必须是声明为void的。

           Invoke(mi);//同步执行委托。               

            //BeginInvoke(mi);异步执行委托。

        }

        private void hello()

        {

            label1.Text = "我是跨线程的!";

        }

 

        private Thread myThread;
        private void Form1_Load(object sender, EventArgs e)
        {
            myThread = new Thread(new ThreadStart(RunsOnWorkerThread));
            myThread.Start();
        }
        private void RunsOnWorkerThread()
        {
            //DoSomethingSlow();
            string pList = "myThread线程调用UI控件";
            label1.BeginInvoke(new System.EventHandler(UpdateUI), pList);
        }
        //直接用System.EventHandler,没有必要自定义委托
        private void UpdateUI(object o, System.EventArgs e)
        {
           //UI线程设置label1属性
            label1.Text = o.ToString() + "成功!";
   
    }

你可能感兴趣的:(thread,多线程,UI,String,object,button)