c#利用委托跨线程调用UI控件完整使用方法

昨天在线程里用到委托来改变UI控件,查了一下资料,感觉没有特别具体的,于是以新手的眼光写了一个很基础的留着自己回顾与新手学习

第一次发文,逻辑乱,请见谅呀 偶咔咔咔

1. 委托的定义

在一个类中定义委托,保证form中与子线程中都可以引用到这个委托
public class DelegateCollection
{
       public delegate void updateUIContorl(string txt);
}



2. 委托的声明

在子线程中对委托声明具体的实例,保证子线程可以直接调用委托,而不用实例化
public class SonThread
    {
        public DelegateCollection.updateUIContorl myDelegate;

        public void runThread()
        {
            string txt = "";
            //...

            //委托的调用 也可以简写成myDelegate?.BeginInvoke(txt,null,null);
            if (myDelegate != null)
            {
                myDelegate(txt);
            }

        }
    }


3. 修改UI控件方法的定义

public class Form1 : Form
    {
        private SonThread sonT;

        public void updateControl(string txt)
        {
            //是否是外线程访问textbox,如果是,需要通过BeginInvoke方法让form主线程自己调用本方法,具体可以看一下
            //https://www.cnblogs.com/zhangchenliang/archive/2012/08/20/2647396.html
            //这篇博客写的不孬看着
            if (textbox.InvokeRequired)
            {
                BeginInvoke(sonT.myDelegate, new object[] { txt });
            }
            else
            {
                this.textbox.Text = txt;
            }
        }
    }


4. 委托的绑定

在form中(主线程)对委托进行绑定,绑定可以操作UI控件的函数

public class Form1 : Form
    {
        private SonThread sonT;
        //绑定
        public void mainThread()
        {
            sonT = new SonThread();
            sonT.myDelegate = new DelegateCollection.updateUIContorl(updateControl);
            Thread myThread = new Thread(new ThreadStart(sonT.runThread));
            myThread.Start();
        }
        ///修改UI的方法   
        public void updateControl(string txt)
        {
            //…
        }
    }



没有更多推荐了,返回首页

私密
私密原因:
请选择设置私密原因
  • 广告
  • 抄袭
  • 版权
  • 政治
  • 色情
  • 无意义
  • 其他
其他原因:
120
出错啦
系统繁忙,请稍后再试

关闭