当前位置: 首页 > wzjs >正文

平顶山北京网站建设云浮罗定哪有做网站的

平顶山北京网站建设,云浮罗定哪有做网站的,wordpress会自动更新,wordpress 蘑菇街版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 从.Net FrameWork2.0开始,为了加强了程序安全,防止跨线程调用导致不可预知的结果。微软将窗体主线程&#x…

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。

从.Net FrameWork2.0开始,为了加强了程序安全,防止跨线程调用导致不可预知的结果。微软将窗体主线程(UI控件线程)和其它线程分开,不允许从其它线程直接跨线程访问窗体主线程。在控制台下面使用多线程不用考虑操作界面的问题,但是在窗体界面下使用多线程,会因为访问控件方法或属性的线程不是创建该控件的线程,在编译调试时产生错误。

先看以下例子:

【例 15.23【项目:code15-023】求1至10亿所有整数之和。

代码和【例 15.6】基本相同,但这次将求得的和显示在文本框中。

增加一个TextBox控件,将【例 15.6】的代码:

     MessageBox.Show(sum.ToString());

修改为:

     TextBox1.Text = sum.ToString();

运行代码会抛出一个“InvalidOperationException”异常:线程间操作无效:从不是创建控件"TextBox1"的线程访问它。

图15-21 跨线程访问异常

注意:直接运行编译后的exe程序,并不会产生错误。

5.3.10.1 CheckForIllegalCrossThreadCalls

CheckForIllegalCrossThreadCalls是Control类的一个属性,通过设置true或者false来指示程序是否捕获对错误线程的调用。如果需要跨线程设置UI,只需要让程序不捕获是否跨线程,将CheckForIllegalCrossThreadCalls设置为false即可。

【例 15.24【项目:code15-024】使用CheckForIllegalCrossThreadCalls跨线程设置UI。

        private void Form1_Load(object sender, EventArgs e)

        {

            //窗体的所有控件都不检查是否跨线程调用

            CheckForIllegalCrossThreadCalls = false;

            //以下代码TextBox不检查是否跨线程调用

            //TextBox.CheckForIllegalCrossThreadCalls = false;

        }

        private void Button1_Click(object sender, EventArgs e)

        {

            //将求和的方法地址传递给Thread的构造函数

            Thread th = new Thread(getSum);

            //启动线程

            th.Start();

        }

        //这里是求1-10亿所有整数的和

        private void getSum()

        {

            Int64 sum = 0;

            for (Int64 i = 1; i <= 1000000000; i++)

                sum += i;

            TextBox1.Text = sum.ToString();

        }

运行结果如下图所示:

图15-22 正常输出计算结果

注意:这种方法只是简单地禁止了检查跨线程错误,是非线程安全的,可能会引发不可预料的线程错误,一般不建议使用。

15.3.10.2 使用委托和Invoke

窗体控件提供Invoke 方法,可以在拥有此控件的基础窗口句柄的线程上执行指定的委托,而在委托中完成UI控件修改。

Invoke方法其中一个重载:

public object Invoke (Delegate method, params object[] args);

参数说明:

  1. method:一个方法委托,它采用的参数的数量和类型与args参数中所包含的相同。
  2. args:作为指定方法的参数传递的对象数组。如果此方法没有参数,args可以设置为null。

注意:Invoke方法另外一个不带args参数的版本接受不带参数的委托。

使用委托和Invoke方法跨线程操作UI界面的基本步骤:

1、创建一个调用方法A,采用多线程调用方法C;

2、声明一个类级的委托B,其参数和调用方法C相同;

3、创建新线程要调用的方法C,在这个方法里面创建需要委托的方法实例D,并关联了E;

4、创建委托关联的方法E,在这个方法中修改UI;

5、在方法C中使用需要修改的控件UI的Invoke方法F。

另外,在方法C中可以先采用InvokeRequired属性判断是否必须调用Invoke方法。

【例 15.25【项目:code15-025】使用委托和Invoke跨线程设置UI

        //委托B:声明一个委托,参数与要调用的方法相同

        private delegate void showSum(Int64 sum);

        //方法A

        private void button1_Click(object sender, EventArgs e)

        {

            Thread th = new Thread(getSum);

            th.Start();

        }

        //方法C:这里是求1-10亿所有整数的和

        private void getSum()

        {

            Int64 sum = 0;

            for (Int64 i = 1; i <= 1000000000; i++)

                sum += i;

            if (textBox1.InvokeRequired)

            {

                //D:获得委托的实例

                showSum newsum = new showSum(showsumIntext);

                //F:控件的Invoke方法调用方法并传递参数

                textBox1.Invoke(newsum, sum);

            }

            else

                textBox1.Text = sum.ToString();

        }

        //E:委托关联的方法,在这个方法中修改UI

        private void showsumIntext(Int64 sum)

        {

            textBox1.Text = sum.ToString();

        }

运行结果同【例 15.24】。

15.3.10.3 使用MethodInvoker 委托

MethodInvoker委托可执行托管代码中声明为 void 且不接受任何参数的任何方法,在调用控件的Invoke方法或需要一个简单委托又不想自己定义时可以使用该委托。

【例 15.26【项目:code15-026】使用MethodInvoker和Invoke跨线程设置UI

        Int64 allsum;

        private void button1_Click(object sender, EventArgs e)

        {

            Thread th = new Thread(getSum);

            th.Start();

        }

        private void getSum()

        {

            Int64 sum = 0;

            for (Int64 i = 1; i <= 1000000000; i++)

                sum += i;

            allsum = sum;

            MethodInvoker showSum = showsumIntext;

            textBox1.Invoke(showSum);

        }

        //无参数,无返回值的方法

        private void showsumIntext()

        {

            textBox1.Text = allsum.ToString();

        }

运行结果同【例 15.24】。

学习更多vb.net知识,请参看vb.net 教程 目录

学习更多C#知识,请参看C#教程 目录


文章转载自:

http://7AO3TQeX.dppLr.cn
http://SN343vPU.dppLr.cn
http://ubVO1U6u.dppLr.cn
http://g4JyniLL.dppLr.cn
http://wtHWCbd7.dppLr.cn
http://26wDT0HM.dppLr.cn
http://g9mNArbF.dppLr.cn
http://fCd3YWQ5.dppLr.cn
http://PAaMPK0L.dppLr.cn
http://KkcYGAcJ.dppLr.cn
http://o0PqywoV.dppLr.cn
http://ZFsWCJjO.dppLr.cn
http://kodcYzMY.dppLr.cn
http://Dlpg0u3f.dppLr.cn
http://sdGGpKkk.dppLr.cn
http://12e7FDFz.dppLr.cn
http://UvGIpR53.dppLr.cn
http://YVqblzVo.dppLr.cn
http://PjkLpdHj.dppLr.cn
http://aq9W8mPf.dppLr.cn
http://NaQuXWz4.dppLr.cn
http://wiPROfPm.dppLr.cn
http://pIw8StZE.dppLr.cn
http://L6lX8njr.dppLr.cn
http://cvUukQfC.dppLr.cn
http://ctCwHQtC.dppLr.cn
http://3oYW31c4.dppLr.cn
http://JUzziYWM.dppLr.cn
http://qLPt8HMk.dppLr.cn
http://u8g8Rpqf.dppLr.cn
http://www.dtcms.com/wzjs/667621.html

相关文章:

  • 如何开网站建设公司深圳网络营销公司
  • 网站必须备案衡水电商网站建设
  • 成都h5建站库存管理软件永久免费版
  • 建设网站用英文怎么说网站建设领导小组
  • 做营销网站企业做网站平台的公司
  • 做机械设计兼职的网站快排seo排名软件
  • 装修平台网站排名前十名有哪些如何用群晖做自己的网站
  • 网站的关键词在哪里设置wordpress首页乱码
  • 浙江常规网站建设自定义表情在线制作
  • 国内好看的网站设计江阴市网站建设
  • 整站关键词排名优化wordpress获取数组长度
  • 怎样查网站备案德阳网站怎么做seo
  • 邯郸网站优化技巧网站栏目功能分析
  • 高端网站设计地址福建网站建设优化
  • 域名购买成功后网站怎么建设网架公司起名
  • 私人做网站网页设计网站长沙
  • 网站qq启动链接怎么做阳明拍卖公司网站
  • 如何提交网站地图大连旅顺口
  • 北京企业网站开发多少钱搜索排名优化策划
  • 做自己视频教程的网站重庆装修
  • 企业做优化好还是超级网站好网站建设的实践目的
  • 团员注册网站衡水专业网站建设公司
  • 响应式网站和自适应网页怎么绑定wordpress
  • 做商铺最好的网站asp做网站很少
  • 移动网站开发公司怎么做网页卖东西
  • 石家庄seo网站建设产品外观设计公司
  • 湖南旅游网站开发女人与马做受网站
  • 安徽建设厅网站首页初中做历史的网站
  • 江苏建站管理系统信息成品网站是什么意思
  • 淘宝上做微请帖的在哪个网站centum wordpress