博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#安全调用线程的步骤
阅读量:5993 次
发布时间:2019-06-20

本文共 2753 字,大约阅读时间需要 9 分钟。

1.声明方法
2.声明委托类型
3.创建委托对象
4.启动线程
5.在线程调用的方法里通过Control的Invoke方法执行委托
public Form1()        {            InitializeComponent();                        //TextBox.CheckForIllegalCrossThreadCalls = false;//线程访问控件(不安全的方式)            dgShowMsgInTextBox = new DGShowMsgInTextBox(DoShowMsgInTextBox);        }        private void btnCount_Click(object sender, EventArgs e)        {            Count();        }              private void Count()//用UI计数(不另外开启线程)        {            DateTime beginTime = DateTime.Now;            for (int i = 0; i < 999999999; i++) { }            System.Threading.Thread.Sleep(3000);            DateTime endTime = DateTime.Now;            TimeSpan ts = endTime.Subtract(beginTime);            MessageBox.Show("计算完毕,总耗时:" + ts.TotalMilliseconds.ToString());        }                private void btnCountByThread_Click(object sender, EventArgs e)//用线程计数        {            //创建线程对象(传入委托对象),也可以直接传方法            Thread thread = new Thread(Count);            thread.Name = "t1";            //将线程标记为可以开始了            thread.Start();        }            private void button1_Click(object sender, EventArgs e)//不安全的访问控件        {            Thread threa = new Thread(CountAndShow);            threa.Start();        }               private void CountAndShow()//不安全的方式访问控件-需要设置TextBox.CheckForIllegalCrossThreadCalls = false        {            DateTime beginTime = DateTime.Now;            for (int i = 0; i < 10000000; i++)            {                txtNum.Text = i.ToString();            }            DateTime endTime = DateTime.Now;            TimeSpan ts = endTime.Subtract(beginTime);            MessageBox.Show("计算完毕,总耗时:" + ts.TotalMilliseconds.ToString());        }               private void CountAndShowSafety()//安全的访问UI线程上的控件        {            DateTime beginTime = DateTime.Now;//记录开始时间            for (int i = 0; i < 10000000; i++)            {                //调用Control类的Invoke方法 执行委托里的 方法                this.Invoke(dgShowMsgInTextBox, i.ToString());            }            DateTime endTime = DateTime.Now;//记录结束时间            TimeSpan ts = endTime.Subtract(beginTime);//计算时间差            MessageBox.Show("计算完毕,总耗时:" + ts.TotalMilliseconds.ToString());            //Random r = new Random();            //r.Next(10)        }               private void button2_Click(object sender, EventArgs e)//安全的访问控件 需要使用委托,并最终通过Control的Invoke方法执行        {            Thread tread = new Thread(CountAndShowSafety);            tread.Start();        }              delegate void DGShowMsgInTextBox(string msg);//安全访问控件的代码 声明一个委托类型                DGShowMsgInTextBox dgShowMsgInTextBox = null;//声明该委托的一个对象(在窗体的构造函数中实例化的),在线程执行代码中要访问控件时通过Invoke方法调用              void DoShowMsgInTextBox(string msg)        {            txtNum.Text = msg;        }

 

转载地址:http://xgvlx.baihongyu.com/

你可能感兴趣的文章
关于override,new 那点事
查看>>
awk用法小结
查看>>
C++运算符重载
查看>>
论文笔记之:Playing Atari with Deep Reinforcement Learning
查看>>
iBeacon
查看>>
多线程编程之四——线程的同步
查看>>
存储过程,触发器,游标
查看>>
php.ini中allow_call_time_pass_reference参数的意思
查看>>
object references an unsaved transient instance - save the transient instance before flushing
查看>>
iPhone控件之UIWebView2
查看>>
Windows Phone SDK 7.1.1 Update正式版发布
查看>>
File的renameTo操作备忘
查看>>
转C++日志库log4cplus使用手册
查看>>
jQuery-插件-图片切换(第一次自已偿试写插件)
查看>>
JavaScript之构造函数初了解
查看>>
Linux文件的复制、删除和移动命令
查看>>
[原创]FineUI秘密花园(二十一) — 表格之动态创建列
查看>>
PowerDesigner(PowerDesigner15.1.0.2850)下载、安装以及破解
查看>>
396种编程开发语言
查看>>
nil、Nil、NULL和NSNull的理解
查看>>