MethodInvoker

本文介绍了一个基于Windows窗体的应用程序如何利用多线程技术来提高CAD文件批量处理效率的方法。通过实例代码展示了如何启动和停止线程,以及如何在主线程和工作线程间安全地更新UI元素。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在程序需要读取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() + "成功!";
   
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值